У меня есть кое-что довольно простое, что я хочу сделать. Я хочу использовать montage
каталог, содержащий тысячи изображений, с очень небольшим количеством опций, а именно:
me@home$ montage -size 256x256 DSC01*.JPG.svg output.png
... но это не достаточно хорошо, поскольку он захватывает только около 100 изображений одновременно; ни один не
me@home$ montage -size 256x256 *.svg output.png
... который захватывает все изображения одновременно, поскольку полученный файл слишком велик для анализа.
Что я хочу сделать, так это перебирать что-то вроде 100-200 файлов одновременно. Я предполагаю, что это может быть реализовано с помощью цикла for (?), Но я просто немного запутался, как это сделать. Я думаю, что есть, вероятно, умный способ использования find -exec
или xargs
о котором я не думаю. Я использую bash
, но я использую zsh
иногда.
Итак, в заключение, я ищу одну строку, которая, учитывая 2600 файлов изображений, вызывает монтаж около 13 или 26 раз (один раз для каждых 100-200 файлов), и учитывая n файлов, может быть вызвана кратно n раз ,
источник
DSC0100.JPG.svg
...DSC2600.JPG.svg
?Ответы:
bash
Метод, использующий специальный массив особенности; вероятно, можно перевестиzsh
с некоторыми изменениями:источник
Вы можете использовать xargs для этого; к сожалению, невозможно объединить -I (для вставки в середину командной строки) и -L (для ограничения количества файлов для одного вызова исполняемого файла). Поэтому я создал эту командную строку в качестве примера (но остерегайтесь специальных символов в именах файлов, они не поддерживаются):
Удалите,
echo
если вы хотите действительно выполнить команду.Предостережения:
Обновить:
Это соответствующий цикл for, который (я надеюсь) решает проблему с пробелами в именах файлов:
Обновление 2: решение Python, которое должно быть защищено от специальных символов в именах файлов
источник
ls
в канале для анализа его выходных данных, вы также должны предупредить о многих опасностях делать это заметно, и в начале, чтобы убедиться, что люди видят это.*.svg
(именно поэтому я разместил комментарий по поводу вопроса). В наиболее общем случае, когда вам нужно обработать все имена файлов, вам придется прибегнуть к глобализации оболочки и массивам илиfind -print0 | xargs -0
конструкциям. Смотрите мой ответ для примера первого.Вот версия с использованием xargs, которая безопасна для любого имени файла, но требует временного файла для хранения счетчика. Настройте '-n 100', чтобы настроить количество файлов за монтаж. Вы также можете поменять местами «printf» с «find -print0», но убедитесь, что он не находит «count.temp».
источник
С GNU Parallel вы можете делать:
Это, конечно, безопасно для файлов со специальными символами (как обычно можно ожидать от GNU Parallel).
Минимальная установка
Если вам просто нужна параллель и у вас не установлена программа 'make' (возможно, система старая или Microsoft Windows):
Посмотрите вступительное видео для быстрого ознакомления: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 или по адресу http://tinyogg.com/watch/TORaR/ и http://tinyogg.com/watch/hfxKj. /
источник