Я использую find для передачи всех каталогов в xargs, и команда для каждого каталога в xargs должна создать для каждого новый каталог, похожий на dirname_a, так как это можно сделать?
т.е.
find . -type d -print0 | xargs -0 mkdir ${DIR}_a && mogrify -path ${DIR}_a -resize '1200x1200>' -quality 95 ${DIR}/*{.jpg|.JPG} {} \;
$ {DIR} не работает, так как это должно быть неправильно
я могу использовать
for D in ./* ; do mkdir ${D}_a && mogrify -path ${D}_a -resize '1200x1200>' -quality 95 ${D}/*{.jpg|.JPG}; done
но это не будет работать ни для каталогов, ни для файлов с пробелами в именах, поэтому я искал find с xargs.
Ответы:
Вот хороший трюк xargs с комбинацией параметров
-I
и-n1
.find . -mindepth 1 -type d | xargs -n1 -I {} bash -c 'mkdir "{}_a" && mogrify -path "{}_a" -resize 1200x1200\> -quality 95 "{}/"*.{jpg,JPG}'
-I {}
говорит xargs сделать замену, когда находит{}
строку в команде.-n1
говорит xargs обрабатывать результаты поиска одна строка за одной.Вы хотите создать несколько экземпляров mogrify, вы можете добавить
-P5
параметр в xargs.Это приведет к 5 процессам за раз и значительно сократит время обработки, особенно если у вас есть много изображений для конвертации.
источник
Не используйте
xargs
. Вместо этого попробуйте цикл:источник
Если строка, хранящаяся в переменной, может содержать пробелы, вы должны поместить двойные кавычки вокруг переменной, то есть
источник