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