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