通过子目录递归运行命令

我试图将一堆图像转换为可能在几个子目录中的缩略图,并将图像的副本保存为子目录中的缩略图,但我无法弄清楚语法。 任何的建议都受欢迎。

convert test/*/*.jpg -50x50 test/*/*_thumb.jpg 

您应该使用find查找所需的所有文件。

 find test -iname *.jpg -exec convert {} -resize 50x50 {}_thumb \; 

然后你应该使用以下命令将名称为* .jpg_thumb的文件重命名为* _thumb.jpg:

 find -name *.jpg_thumb -exec rename -e 's/^(.*)(.jpg)(_thumb)$/\1\3\2/' '{}' \; 

请注意,-50×50不是转换的合法参数。 您应该使用值为50x50 -resize参数,如上例所示。

shell循环也应该:

 for file in test/*/*.jpg ; do new=${file%.jpg}_thumb.jpg convert "$file" -resize 50x50 "$new" done 

或者使用Bash的globstar ,如果文件可以在任意目录级别上,那就更好了:

 shopt -s globstar for file in test/**/*.jpg ; do ... 

${file%.jpg}获取变量file的值,并从末尾删除字符串.jpg 。 (参见关于参数扩展的BashGuide )