У меня есть упражнение, в котором я должен удалить все файлы, которые не являются 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 .