Вопрос: Удалить все файлы не jpeg


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

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


2
2017-08-15 06:17


Источник


возможный дубликат Как удалить все файлы в каталоге, кроме некоторых? - LPChip
Этот вопрос, Как удалить все файлы в каталоге, кроме некоторых?, обсуждает, как удалять файлы на основе имени файла, Этот вопрос, напротив, задает вопрос о том, как удалить на основе типа файла как сообщается в file команда. - John1024


Ответы:


Удаление по типу файла

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


6
2017-08-15 06:24



Нет нет. Нет файлов «* .jpeg», у них нет формата по имени. Я могу узнать его имя, используя команду «файл». - diego9403
@adrian ОК, ОК. См. Обновленный ответ. - John1024
Я не нашел ответа. Я должен добавить, что в папках много папок, поэтому «ls -l» недостаточно. Я думал о «-exec», но его принимают только один commant и мой любимый «|», не работает. - diego9403
@adrian Посмотрите еще раз: я не использовал ls -l, я использовал find который будет искать все подпапки. Во-вторых, посмотрите как я использовал -exec, -exec команда запускает оболочку bash, а оболочка bash fuilly поддерживает такие функции, как | а также ||, - John1024
Хорошо, но я должен знать, что такое тип файлов («jpeg»), поэтому я должен использовать «файл», но эта команда затрудняет работу. После использования 'file' я не могу использовать rm для удаления файлов. - diego9403