Intereting Posts
tar –exclude не исключает. Зачем? Удалить папку с пустым (?) Именем файла Управление громкостью динамика Bluetooth с помощью клавиш и иконки в трее Как отключить запрос пароля для автоматического обновления в Red Hat RAMDISK неполная запись ошибка ядро ​​паника Является ли ядро ​​Linux бесплатным для изменения? Java не смог получить TGT из кеша в клиенте Linux Удалить панель из одного рабочего пространства в xfce Показать уведомление обо всех запущенных X-дисплеях Совпадение шаблонов в сценарии Bash с именами файлов с нулевой загрузкой Замените все вхождения символа в переменной с помощью скрипта korn почему я не могу установить пакеты с rpm? Я получаю «блокировку транзакций» grub – перейти на следующий диск Переименование рабочих областей в интерактивном режиме с помощью DynamicWorkspaces не работает предотвращение очистки экрана при выходе из сеанса ssh

Запустите команду с подстановочными знаками в каждом подкаталоге

Я использую эту команду, чтобы выполнить монтаж всех изображений в каталоге:

gmic *jpg -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o -0000."$(date)".jpg 

Я хочу запустить эту команду в директории и ее подкаталогах рекурсивно. Поэтому в каждом каталоге я создавал бы монтаж изображений в этом каталоге.

Я пытался:

 find -exec gmic *jpg -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o -0000."$(date)".jpg 

но это дало мне ошибку

 find: missing argument to `-exec' 

Я также пробовал

 find -exec gmic -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o -0000."$(date)".jpg {} \; 

что дало мне следующую ошибку:

 [gmic]-0./ Start G'MIC interpreter. [gmic]-0./ Output image [] as file '-0000.Fri Mar 13 04:33:44 EDT 2015.jpg', with quality 100%. [gmic]-0./ *** Error *** Command '-output': File '-0000.Fri Mar 13 04:33:44 EDT 2015.jpg', instance list (0,(nil)) is empty. [gmic] *** Error in ./ *** Command '-output': File '-0000.Fri Mar 13 04:33:44 EDT 2015.jpg', instance list (0,(nil)) is empty. 

Итак, вы хотите запустить команду в каждом каталоге в дереве каталогов – текущем каталоге, его подкаталогах, их подкаталогах и т. Д. Первое, что нужно сделать, это перечислить каталоги, о которых идет речь. С помощью команды find скажите ей, чтобы перечислять только каталоги:

 find . -type d 

Команда, которую вы хотите запустить в каждом каталоге, – это

 gmic ./*jpg -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o -0000."$(date)".jpg 

Это команда оболочки, содержащая расширение подстановки и замену команды. Для его выполнения нужно запустить оболочку. Поскольку этой оболочке будет рассказано, что делать, find , это не будет оболочкой, в которой вы работаете, find : вам нужно сказать find чтобы запустить оболочку. Передайте каталог, в котором вы хотите действовать как аргумент оболочки.

 find . -type d -exec sh -c '…' {} \; 

Прежде чем вы сможете вызвать gmic , вам нужно сделать пару вещей в этом скрипте: перейдите в соответствующий каталог и убедитесь, что он содержит файлы .jpg .

 find . -type d -exec sh -c ' cd "$0" || exit set -- *.jpg if [ -e "$1" ]; then gmic "$@" -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o -0000."$(date)".jpg fi ' {} \; 

В качестве альтернативы, вы можете сказать, что find список .jpg файлов. Однако это затрудняет выполнение команды только по одному каталогу.

Если ваша оболочка bash, в отличие от простой sh , вы можете использовать ее ** подстановочный знак для рекурсии в каталоги. Это проще, чем использование find . В bash ≤4.2, будьте осторожны, что ** перемещает символическую ссылку на каталоги. Вы также можете немного упростить тест существования файла.

 shopt -s globstar nullglob for dir in ./**/*/; do files=("$dir/"*.jpg) if [[ ${#files[@]} -ne 0 ]]; then gmic "${files[@]}" -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o "$dir/-0000.$(date)".jpg fi done 

В zsh вы можете использовать модификатор истории в квалификаторе glob, чтобы перечислять каталоги, содержащие файлы .jpg , а затем фильтровать полученный массив, чтобы хранить одну копию каждого каталога.

 dirs=(./**/*.jpg(:h)) for dir in ${(u)dirs}; do gmic $dir/*.jpg -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o "$dir/-0000.$(date).jpg" done 

(Помимо: -0000.Sat Mar 14 15:51:28 CET 2015.jpg – это действительно странное имя для файла. Файлы, чье имя начинается с - имеют тенденцию вызывать проблемы, потому что они выглядят как опции для команд. Даты более удобны для манипулировать в формате, где сортировка лексикографически идентична сортировке в хронологическом порядке, например, 20150314-145128 .)

Как и в остальных комментариях, я не уверен, что вам нужно для чего-то, чтобы вы могли запускать любую команду больше, чем либо -exec, или биты в секунду или цикл. Вариант exec позволит вам использовать «{}» вместо того, что он нашел (полный путь, а не относительный). Ниже приведен краткий пример как -exec, так и цикла for.

 $ tree . |-- a | |-- a | | `-- a | `-- b `-- b |-- a `-- b 7 directories, 0 files $ find . -type d -exec touch {}/foo \ $ tree . |-- a | |-- a | | |-- a | | | `-- foo | | `-- foo | |-- b | | `-- foo | `-- foo |-- b | |-- a | | `-- foo | |-- b | | `-- foo | `-- foo `-- foo 7 directories, 8 files $ for i in $(find . -type f); do mv $i $i.moved; done $ tree . |-- a | |-- a | | |-- a | | | `-- foo.moved | | `-- foo.moved | |-- b | | `-- foo.moved | `-- foo.moved |-- b | |-- a | | `-- foo.moved | |-- b | | `-- foo.moved | `-- foo.moved `-- foo.moved 7 directories, 8 files