2

У меня есть упражнение, в котором я должен удалить все файлы, которые не являются jpeg .

Я попытался find -type f |xargs file| grep -iv 'jpeg' , но это не работает.

1 ответ1

6

Удаление на основе файла mimetype

Чтобы удалить все обычные файлы не в формате 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .