我正在使用 find 将所有目录传递给 xargs,并且 xargs 在每个目录上的命令需要为每个目录创建一个新目录,看起来像 dirname_a,那么如何做到这一点?
IE
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
但这无法在名称中带有空格的目录或文件上运行,所以这就是我使用 xargs 查找的原因。
答案1
-I
这里有一个使用和参数组合的很好的 xargs 技巧-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 个进程,并大大减少您的处理时间,特别是当您有大量图片需要转换时。
答案2
不要使用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
答案3
如果变量中存储的字符串可以包含空格,则必须用双引号将变量括起来,即
for D in ./* ; do mkdir "$D"_a && .... ; done