Как я могу удалить файлы, содержащие число «3» или «2» в имени файла?

В настоящее время я пытаюсь удалить некоторые файлы. Файлы, которые я хочу удалить, содержат число 3 или 2, либо оба, либо одно из них.

Как удалить файлы, содержащие эти числа?

Файлы названы так:

K-0_0_1_1_1_1_1_0.wav K-0_0_1_1_1_1_1_1.wav K-0_1_0_0_0_0_0_0.wav K-0_1_0_0_0_0_0_1.wav K-0_1_0_0_0_0_1_0.wav K-0_0_0_0_0_0_0_2.wav K-0_0_0_0_0_0_0_3.wav K-0_0_0_0_0_0_1_2.wav

В этом списке последние три файла должны быть удалены ,

5
задан 23 August 2017 в 20:54

11 ответов

Для текущего каталога вы можете использовать:

rm -- *[23]*

Если вы хотите ограничить его, чтобы соответствовать только файлам, где 2 или 3 должны встречаться между K и .wav: [ ! d1]

rm K*[23]*.wav

Если вы хотите сделать это более безопасным, заставив rm запросить подтверждение для каждого файла, используйте интерактивный флаг -i:

rm -i K*[23]*.wav

Примечания

shell glob * соответствует любому числу (включая ноль) любых символов в оболочке [some chars] - это класс символов - все, что внутри может соответствовать --, распознается rm как конец опций , Это позволяет избежать ошибок, если имена файлов начинаются с -; в противном случае имя файла может быть интерпретировано как опция

Если вам нужно избегать сопоставления 22, 23, 32, 33, вам понадобится нечто более сложное, например, AFSHIN's ответ.

20
ответ дан 22 May 2018 в 19:09
  • 1
    Действительно, этот список персонажей еще более изящный, чем два глобуса :-) – Byte Commander 23 August 2017 в 13:52
  • 2
    @ByteCommander благодарит :) но, может быть, проще испортить ха-ха. И вы демонстрируете, что rm принимает несколько аргументов – Zanna 23 August 2017 в 14:07
  • 3
    Хорошо, если rm не принимал несколько имен файлов, ни один из способов не работал бы, когда оболочка расширяет glob до более чем одного имени файла. Основными отличиями между rm -- *[23]* и rm -- *2* *3* являются (a), что *2* *3* может давать одно и то же имя файла дважды и (b) порядок. С файлами OP echo *[23]* показывает K-0_0_0_0_0_0_0_2.wav K-0_0_0_0_0_0_0_3.wav K-0_0_0_0_0_0_1_2.wav, а echo *2* *3* показывает K-0_0_0_0_0_0_0_2.wav K-0_0_0_0_0_0_1_2.wav K-0_0_0_0_0_0_0_3.wav. С помощью rm это влияет на порядок удаления, и поэтому отображаются ошибки порядка (или сообщения из-за -v, -i или -I). – Eliah Kagan 23 August 2017 в 15:45
  • 4
    @EliahKagan о да, конечно, в первую часть :) Я не понимал, что это повлияет на порядок выхода, хотя – Zanna 23 August 2017 в 16:18
  • 5
    Это верно для вашего ответа. – αғsнιη 24 August 2017 в 05:04

Вы можете использовать shell globs:

rm *2* *3*

Это приведет к удалению всех файлов (не каталогов) внутри текущего рабочего каталога, которые будут согласованы с любым из *2* или *3* globs.

В этих шарах «* всегда означает« любое число (включая ноль) любого символа ».

Обратите внимание, что глобусы IIRC Bash не соответствуют скрытым файлам (имя файла начиная с .) по умолчанию.

8
ответ дан 22 May 2018 в 19:09
  • 1
    Я думаю, rm *{2,3}* эквивалентен – wjandrea 23 August 2017 в 23:14
  • 2
    этот rm *2* *3* удаляет файл K-0_0_0_0_3_0_1_2.wav два раза в качестве примера, а вторая попытка не удалась, поскольку она была удалена ранее с помощью сопоставленного шаблона *2* в rm – αғsнιη 24 August 2017 в 04:20
  • 3
    + это удалит файлы с соответствующими *2*3* или *3*2*, например file_22222.wav или file_333333.wav или file_23.wav, ... как и другие ответы, пожалуйста, проверьте мой ответ также – αғsнιη 24 August 2017 в 04:57

Для текущего каталога или любого другого местоположения:

Запустите это, чтобы увидеть, что нужно удалить:
find . -type f -iname "*[32]*.wav" 
Затем удалить с помощью:
find . -type f -iname "*[32]*.wav" -delete

Дополнительная информация: [ ! d6] . означает текущий каталог, также может быть путь к местоположению файла, например /path/to/files. Чтобы предотвратить перемещение find в любой каталог целевого объекта, используйте параметр -maxdepth 1, следовательно: [ f7] Если в целевом каталоге используйте: find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete

ВНИМАНИЕ

Никогда не делайте этого find . -delete -type f -iname "*[32]*.wav" иначе все (ваши файлы) будут удалены!

5
ответ дан 22 May 2018 в 19:09
  • 1
    Почему не просто -delete вместо -exec rm {} \;? Нет необходимости вызывать rm для каждого отдельного файла. – David Foerster 23 August 2017 в 14:34
  • 2
    @DavidFoerster обновил ответ, спасибо – George Udosen 23 August 2017 в 14:41
  • 3
    Если по какой-либо причине один делает , вызывают rm из find, лучше использовать rm --, поэтому аргументы (имена) имени файла не будут интерпретироваться как параметры. В противном случае кто-то может назвать файл чем-то вроде -r и вызвать проблемы ... find -delete действие почти всегда является лучшим подходом. – Eliah Kagan 23 August 2017 в 14:51
  • 4
    +1 для использования find. Используйте его в два шага, первый шаг без -delete, так что вы увидите, что вы собираетесь удалить дальше. Кроме того, следите, если вы перемещаете -delete перед типом -type и -iname, вы удаляете все. – Jérôme 23 August 2017 в 19:03
  • 5
    Это удаление файлов, включая файлы *23* или *32*. – αғsнιη 24 August 2017 в 04:45

Хотя данные ответы также удаляют файлы, в том числе *23*, *32*, *2*3*, *3*2*, *2* или *3* файлы шаблонов + этот ответ с rm *2* *3* решением попытается удалить файл K-0_0_0_0_3_0_1_2.wav два раза и вторая попытка не удалась, поскольку она была удалена с помощью *2* сопоставленного шаблона!.

Чтобы избежать этого, ниже приведена команда, которая возвращает только файлы, включая 2 или 3 или оба в именах их повторяется только один раз.

find . -type f -name "*[^0-9][2|3][^0-9]*" #-delete

Или в rm вы могли бы использовать следующее:

rm -- *[^0-9][23][^0-9]*
2
ответ дан 22 May 2018 в 19:09
  • 1
    Я в bash 4.3 – αғsнιη 24 August 2017 в 08:37
  • 2
    жаль, что это было плохо, мои имена были слишком разнообразны - он работает с файлами OP. Но TIL мы можем использовать [^.] отрицание в оболочке! – Zanna 24 August 2017 в 11:23

Я поклонник xargs, который позволяет просмотреть перед запуском Command:

$ echo *2* *3*
(list of files with 2 or 3 in name)

Это только тест glob shell (работает в bash), если список верен, pipe it to xargs:

$ echo *2* *3* | xargs rm -v

Опция -v показывает файлы, которые удаляются rm. Вы можете быть более параноидальными и добавить параметр -i с помощью -v, чтобы он запрашивал каждое удаление.

0
ответ дан 22 May 2018 в 19:09
  • 1
    xargs умирает ужасно, если в именах файлов есть пробелы, хотя ... – Zanna 23 August 2017 в 22:50
  • 2
    Простое исправление для xargs, используйте find. -type f -name file-pattern -print0 | xargs -0 rm -v. Пространства в файлах не являются проблемой для args, если вы используете -0 для изменения разделителя на нулевой символ. Если вы хотите другой, используйте -d 'char', где char - разделитель, который вы хотите использовать. Обычно я использую -exec вместо того, чтобы нажимать на xargs на команды find самостоятельно. – Walter 24 August 2017 в 03:38

Вы можете использовать shell globs:

rm *2* *3*

Это приведет к удалению всех файлов (не каталогов) внутри текущего рабочего каталога, которые будут согласованы с любым из *2* или *3* globs.

В этих шарах «* всегда означает« любое число (включая ноль) любого символа ».

Обратите внимание, что глобусы IIRC Bash не соответствуют скрытым файлам (имя файла начиная с .) по умолчанию.

8
ответ дан 18 July 2018 в 08:03

Для текущего каталога или любого другого местоположения:

Запустите это, чтобы увидеть, что нужно удалить: find . -type f -iname "*[32]*.wav" Затем удалить с помощью: find . -type f -iname "*[32]*.wav" -delete

Дополнительная информация: [ ! d6] . означает текущий каталог, также может быть путь к местоположению файла, например /path/to/files. Чтобы предотвратить перемещение find в любой каталог целевого объекта, используйте параметр -maxdepth 1, следовательно: find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete Если в целевом каталоге используйте: find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete

ВНИМАНИЕ

Никогда не делайте этого find . -delete -type f -iname "*[32]*.wav" иначе все (ваши файлы) будут удалены!

5
ответ дан 18 July 2018 в 08:03

Я поклонник xargs, который позволяет просмотреть перед запуском Command:

$ echo *2* *3* (list of files with 2 or 3 in name)

Это только тест glob shell (работает в bash), если список верен, pipe it to xargs:

$ echo *2* *3* | xargs rm -v

Опция -v показывает файлы, которые удаляются rm. Вы можете быть более параноидальными и добавить параметр -i с помощью -v, чтобы он запрашивал каждое удаление.

0
ответ дан 18 July 2018 в 08:03

Вы можете использовать shell globs:

rm *2* *3*

Это приведет к удалению всех файлов (не каталогов) внутри текущего рабочего каталога, которые будут согласованы с любым из *2* или *3* globs.

В этих шарах «* всегда означает« любое число (включая ноль) любого символа ».

Обратите внимание, что глобусы IIRC Bash не соответствуют скрытым файлам (имя файла начиная с .) по умолчанию.

8
ответ дан 24 July 2018 в 18:58
  • 1
    Я думаю, rm *{2,3}* эквивалентен – wjandrea 23 August 2017 в 23:14
  • 2
    этот rm *2* *3* удаляет файл K-0_0_0_0_3_0_1_2.wav два раза в качестве примера, а вторая попытка не удалась, поскольку она была удалена ранее с помощью сопоставленного шаблона *2* в rm – αғsнιη 24 August 2017 в 04:20
  • 3
    + это удалит файлы с соответствующими *2*3* или *3*2*, например file_22222.wav или file_333333.wav или file_23.wav, ... как и другие ответы, пожалуйста, проверьте мой ответ также – αғsнιη 24 August 2017 в 04:57

Для текущего каталога или любого другого местоположения:

Запустите это, чтобы увидеть, что нужно удалить: find . -type f -iname "*[32]*.wav" Затем удалить с помощью: find . -type f -iname "*[32]*.wav" -delete

Дополнительная информация: [ ! d6] . означает текущий каталог, также может быть путь к местоположению файла, например /path/to/files. Чтобы предотвратить перемещение find в любой каталог целевого объекта, используйте параметр -maxdepth 1, следовательно: find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete Если в целевом каталоге используйте: find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete

ВНИМАНИЕ

Никогда не делайте этого find . -delete -type f -iname "*[32]*.wav" иначе все (ваши файлы) будут удалены!

5
ответ дан 24 July 2018 в 18:58
  • 1
    Почему не просто -delete вместо -exec rm {} \;? Нет необходимости вызывать rm для каждого отдельного файла. – David Foerster 23 August 2017 в 14:34
  • 2
    @DavidFoerster обновил ответ, спасибо – George Udosen 23 August 2017 в 14:41
  • 3
    Если по какой-либо причине один делает , вызывают rm из find, лучше использовать rm --, поэтому аргументы (имена) имени файла не будут интерпретироваться как параметры. В противном случае кто-то может назвать файл чем-то вроде -r и вызвать проблемы ... find -delete действие почти всегда является лучшим подходом. – Eliah Kagan 23 August 2017 в 14:51
  • 4
    +1 для использования find. Используйте его в два шага, первый шаг без -delete, так что вы увидите, что вы собираетесь удалить дальше. Кроме того, следите, если вы перемещаете -delete перед типом -type и -iname, вы удаляете все. – Jérôme 23 August 2017 в 19:03
  • 5
    Это удаление файлов, включая файлы *23* или *32*. – αғsнιη 24 August 2017 в 04:45

Я поклонник xargs, который позволяет просмотреть перед запуском Command:

$ echo *2* *3* (list of files with 2 or 3 in name)

Это только тест glob shell (работает в bash), если список верен, pipe it to xargs:

$ echo *2* *3* | xargs rm -v

Опция -v показывает файлы, которые удаляются rm. Вы можете быть более параноидальными и добавить параметр -i с помощью -v, чтобы он запрашивал каждое удаление.

0
ответ дан 24 July 2018 в 18:58
  • 1
    Действительно, этот список персонажей еще более изящный, чем два глобуса :-) – Byte Commander 23 August 2017 в 13:52
  • 2
    @ByteCommander благодарит :) но, может быть, проще испортить ха-ха. И вы демонстрируете, что rm принимает несколько аргументов – Zanna 23 August 2017 в 14:07
  • 3
    Хорошо, если rm не принимал несколько имен файлов, ни один из способов не работал бы, когда оболочка расширяет glob до более чем одного имени файла. Основными отличиями между rm -- *[23]* и rm -- *2* *3* являются (a), что *2* *3* может давать одно и то же имя файла дважды и (b) порядок. С файлами OP echo *[23]* показывает K-0_0_0_0_0_0_0_2.wav K-0_0_0_0_0_0_0_3.wav K-0_0_0_0_0_0_1_2.wav, а echo *2* *3* показывает K-0_0_0_0_0_0_0_2.wav K-0_0_0_0_0_0_1_2.wav K-0_0_0_0_0_0_0_3.wav. С помощью rm это влияет на порядок удаления, и поэтому отображаются ошибки порядка (или сообщения из-за -v, -i или -I). – Eliah Kagan 23 August 2017 в 15:45
  • 4
    @EliahKagan о да, конечно, в первую часть :) Я не понимал, что это повлияет на порядок выхода, хотя – Zanna 23 August 2017 в 16:18
  • 5
    xargs умирает ужасно, если в именах файлов есть пробелы, хотя ... – Zanna 23 August 2017 в 22:50
  • 6
    Простое исправление для xargs, используйте find. -type f -name file-pattern -print0 | xargs -0 rm -v. Пространства в файлах не являются проблемой для args, если вы используете -0 для изменения разделителя на нулевой символ. Если вы хотите другой, используйте -d 'char', где char - разделитель, который вы хотите использовать. Обычно я использую -exec вместо того, чтобы нажимать на xargs на команды find самостоятельно. – Walter 24 August 2017 в 03:38
  • 7
    Это верно для вашего ответа. – αғsнιη 24 August 2017 в 05:04
  • 8
    Я в bash 4.3 – αғsнιη 24 August 2017 в 08:37
  • 9
    жаль, что это было плохо, мои имена были слишком разнообразны - он работает с файлами OP. Но TIL мы можем использовать [^.] отрицание в оболочке! – Zanna 24 August 2017 в 11:23

Другие вопросы по тегам:

Похожие вопросы: