Как рекурсивно удалить все файлы JPG, но оставить те, которые содержат "образец"

Как я могу найти и удалить все .jpg файлы в дереве каталогов, за исключением тех, которые содержат "образец" в своем имени файла?

Например:

a.zip          ->  keep it  
b.jpg          ->  delete it  
a-sample.jpg   ->  keep it  
b-Sample.jpg   ->  keep it  

2 ответа

Решение

Удалить все файлы, оканчивающиеся на.jpg (без учета регистра) за исключением файлов с sample в имени файла (без учета регистра:

find . ! -iname '*sample*'  -iname '*.jpg' -delete

Это повторяется по всем каталогам в дереве, начиная с текущего каталога.

Как это устроено:

  • .

    Это указывает, что мы начинаем с текущего каталога.

  • ! -iname '*sample*'

    Это инструктирует find игнорировать все файлы с sample во имя i в -iname делает этот тест нечувствительным к регистру.

  • -iname '*.jpg'

    Это условие, которое было бы и с предыдущим, ищет файлы, оканчивающиеся на .jpg,

  • -delete

    Это инструктирует find удалить все такие файлы.

Перед запуском вышеуказанной команды вы можете протестировать ее. Бежать:

find . ! -iname '*sample*'  -iname '*.jpg'

Это распечатает файлы, представляющие интерес. Если этот список хорош, то снова запустите команду с -delete прилагается.

В Bash вы можете использовать

shopt -s extglob

чтобы включить отрицательное соответствие:

rm !(*[Ss]ample*).jpg

Чтобы сопоставить подпапки, включите

shopt -s globstar

и используйте двойную звезду:

rm **/!(*[Ss]ample*).jpg
Другие вопросы по тегам