Я использую 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.

3 ответа3

1

Не используйте xargs . Вместо этого попробуйте цикл:

find . -mindepth 1 -type d | 
 while IFS= read -r dir; do mkdir "$dir"_a && 
  mogrify -path "$dir"_a -resize '1200x1200>' -quality 95 "$dir/"*.{jpg,JPG}; \
 done
1

Если строка, хранящаяся в переменной, может содержать пробелы, вы должны поместить двойные кавычки вокруг переменной, то есть

for D in ./* ; do mkdir "$D"_a && .... ; done
1

Вот хороший трюк 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 процессам за раз и значительно сократит время обработки, особенно если у вас есть много изображений для конвертации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .