Я пытаюсь изменить размер всех файлов, найденных с помощью команды FIND (все они являются файлами в каталоге и его подкаталогах). Я пробовал много вариантов, но каждый раз натыкался на разные ошибки. Это моя последняя попытка:
find /my/folder/ -name '*jpg' -exec 'mogrify -resize 900">"{}' \;
Я пробовал много других, но безуспешно. Что не так?
Мне не очень нравится exec on find, он немного древний и непредсказуемый, особенно когда вы кормите его всеми цитатами :)
Попробуйте использовать xargs, он должен вести себя более цивилизованно
find /my/folder/ -name '*jpg' -print0 | xargs -0 -J% "mogrify -resize 900 > %"
Вещи, которые здесь разные
-print0 при поиске добавляет символ NULL после каждого имени файла в качестве разделителя
в xargs
-0 сообщает, что ввод разделен NULL char -J% говорит, что% следует заменить содержимым во вводе (в данном случае имя файла)
@lynxman придерживается традиционного совета find / xargs. Однако другой альтернативой является использование find с GNU parallel. Parallel предлагает некоторые изящные улучшения xargs, такие как более сложная обработка аргументов и возможность запускать множество заданий параллельно (я понимаю, что некоторые новые версии xargs также поддерживают параллельные задания).
Итак, давайте посмотрим, сможем ли мы переписать это параллельно. Как насчет:
find /my/folder -name '*jpg' -print0 | parallel --progress -0 -j +0 "mogrify -resize 900\> {}"
который найдет все файлы jpeg и запустит их параллельно. parallel будет запускать столько заданий параллельно, сколько у вас ядер процессора (-j +0
).
Если вы обрабатываете много файлов, вы можете значительно сэкономить время, разумно группируя такие задания. В --progress
опция отображает некоторые подробности по мере выполнения задания.
В -print0
из команды find использует нули для разделения вывода на случай, если у вас есть пробелы или странные символы в именах файлов. В -0
опция для параллельной обработки ожидает ввода, разделенного нулями. Если вы уверены, что ваши входные имена файлов не содержат пробелов, вы можете опустить -print0 / -0
. Обратите внимание, что большинство версий xargs также принимает -0
вариант, поэтому вы можете использовать этот трюк как с xargs, так и с parallel.
РЕДАКТИРОВАТЬ: Из комментариев я не совсем правильно понял команды. Скорректирован могрифай, когда я действительно пытался его использовать. Не нужно сохранять в новые файлы, потому что mogrify по умолчанию записывает в существующий файл.
Редактировать: Извините, я только что понял, что это не перенаправление в вашей команде. Это специальная инструкция для mogrify
.
Я бы пропустил одинарные кавычки и попробовал следующее:
find /my/folder/ -name '*jpg' -exec mogrify -resize 900">" {} \;
Используя команду в том виде, в каком вы ее разместили, вы, вероятно, получаете сообщения об ошибках, например:
find: `mogrify -resize 900">"filename': No such file or directory.
Оригинальный ответ:
Чтобы перенаправление работало внутри -exec
вам нужно использовать sh -c
:
find /my/folder/ -name '*jpg' -exec sh -c 'mogrify -resize 900 > "$@" ' _ {} \;
Только в последние несколько дней я начал видеть, как люди ставят под сомнение использование -exec
. Я не видел, чтобы кто-то конкретно говорил, что с этим не так. У меня большой опыт его использования, и он меня никогда не подводил. Однако бывают случаи, когда xargs
определенно выгоден из-за предоставляемого контроля и способности передавать несколько аргументов одновременно. Однако когда вы используете -I
, он передает только один аргумент за раз. У команды, которую я здесь показал, есть недостаток вызова оболочки для каждого найденного файла.
Здесь старый, но про простой никто ничего не сказал:
ls | xargs mogrify - размер 900
который будет работать со всеми файлами в текущем каталоге -good
для настраиваемого действия thunar также добавьте -quality xx
также.
Или для настраиваемого действия только для выбранных файлов:
mogrify - размер 900% F