如何在基本文件夹的每个子文件夹中运行bash

时间:2015-05-26 11:52:35

标签: bash shell unix console

我想'优化'我所有的* .png图片并找到this所以我按照以下说法制作了bash:

#!/bin/bash    
pngnq -vf -s1 *.png    
rename -f 's/-nq8.png$/.png/' *.png    
optipng -o7 *.png

这里我有两个问题:

第一行是第二行(重命名)什么也不做......它应该将名为[name]-nq8.png的所有图像更改为原始名称的第一行b /的结果

第二个主要问题是:我有一个名为ImagesFolder的文件夹,里面我有更多* .pngs的其他文件夹,我想在ImagesFolder的每个子文件夹中运行此bash,但我不知道该怎么做(我是unix和shellscripts的新手等等)我尝试过的东西不起作用或者是一团糟......

为了更好地理解我所拥有的是:

ImagesFolder
  |-Folder1
  |     |- Folder12
  |     |      |-20 images here
  |     |- Folder13
  |     |      |- 10 images more here
  |     |- 5 images here 
  |-more images

我希望脚本从ImagesFolder

运行

非常感谢你!

2 个答案:

答案 0 :(得分:2)

通常,当您希望在目录树上递归执行某些操作时,要使用的工具是find。如果您的脚本名为foo

find /path/of/base/dir -type f -name '*.png' -exec foo {} \;

将在名称以.png结尾的目录树中的每个常规文件上调用脚本。

答案 1 :(得分:0)

我可能会做的是:

1)修复脚本,使其占用args而不是当前目录中的globbing:

#!/bin/bash    
pngnq -vf -s1 "$1"    
mv "${1%.png}-nq8.png" "$1"
optipng -o7 "$1"

2)测试它是否按预期工作

3)并行运行findxargs(我打赌你有多核处理器)

find . -name '*.png' -print0 | xargs -0 -P6 -n1 the_script

脚本也可以内联。但我的主要观点是,如果您使用多核,请使用并行性。它会加快速度。