将所有目录名称传递给 xargs 后如何调用它们?

将所有目录名称传递给 xargs 后如何调用它们?

我正在使用 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

相关内容