Как рекурсивно удалить все файлы JPG, но сохранить те, которые содержат «sample»

Как рекурсивно удалить все файлы JPG, но сохранить те, которые содержат «sample»

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

Например :

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

решение1

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

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

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

Как это работает:

  • .

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

  • ! -iname '*sample*'

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

  • -iname '*.jpg'

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

  • -delete

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

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

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

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

решение2

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

shopt -s extglob

для включения отрицательного соответствия:

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

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

shopt -s globstar

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

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

Связанный контент