У меня есть упражнение, в котором я должен удалить все файлы, которые не являются jpeg
.
Я попытался find -type f |xargs file| grep -iv 'jpeg'
, но это не работает.
Чтобы удалить все обычные файлы не в формате JPEG в текущем каталоге или его подкаталогах, используйте:
find . -type f -exec bash -c 'file -bi "$1" | grep -q image/jpeg || rm "$1"' none {} \;
Этот подход безопасен для всех имен файлов. Это будет работать, даже если в именах файлов есть символы новой строки или другие сложные символы.
find . -type f
Это запускает команду find
, ограничивая найденные файлы обычными файлами, -type f
.
-exec bash -c 'file -bi "$1" | grep -q image/jpeg || rm "$1"' none {} \;
Для всех найденных файлов запускается команда bash для проверки типа файла. В частности, file -bi "$1" | grep -q image/jpeg
вернет true, если file
сообщит, что файл имеет mimetype image/jpeg
. Оператор ||
Гарантирует, что следующая команда rm
выполняется только для файлов, которые не прошли тест jpeg. Таким образом, все файлы не в формате JPEG удаляются.
Чтобы удалить все файлы, имена которых не заканчиваются на .jpeg
:
find . -type f ! -name '*.jpeg' -delete
Этот подход также безопасен для всех имен файлов. Это будет работать, даже если в именах файлов есть символы новой строки или другие сложные символы.
find .
Найти все файлы в текущем каталоге и его подкаталогах
-type f
Ограничимся только обычными файлами
! -name '*.jpeg'
-name '*.jpeg'
найдет все файлы, имена которых заканчиваются на .jpeg
. Восклицательный знак !
Однако означает отрицание. ! -name '*.jpeg'
ограничивает наш поиск файлами, имена которых не заканчиваются на .jpeg
.
-delete
Это говорит find
для удаления файлов, которые соответствуют вышеуказанным критериям.
Чтобы проверить команду, отключите -delete
:
find . -type f ! -name '*.jpeg'
Это покажет вам, какие файлы будут удалены при использовании действия -delete
.