
Как найти и удалить все .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
в имени которых есть.i
In-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