Как я могу найти и удалить все файлы .jpg в дереве каталогов, кроме тех, которые содержат "образец" в имени файла?
Например :
a.zip -> keep it
b.jpg -> delete it
a-sample.jpg -> keep it
b-Sample.jpg -> keep it
Удалить все файлы, оканчивающиеся на. 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 .
В Bash вы можете использовать
shopt -s extglob
чтобы включить отрицательное соответствие:
rm !(*[Ss]ample*).jpg
Чтобы сопоставить подпапки, включите
shopt -s globstar
и используйте двойную звезду:
rm **/!(*[Ss]ample*).jpg