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

How can I run a bash in every subfolder of a base folder

我想 'optimize' 我所有的 *.png 图像并找到 this 所以我做了 bash 正如它所说的那样:

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

这里我有两个问题:

第一个是第二行(重命名)什么都不做...它应该更改所有名为 [name]-nq8.png 的图像,这是 bash 第一行的结果到原来的名字

第二个也是主要的问题是:我有一个名为 ImagesFolder 的文件夹,里面还有其他包含更多 *.png 的文件夹,我想 运行 这个 bash 在 ImagesFolder 的每个子文件夹中,但是我不知道该怎么做(我是 unix 和 shellscripts 等方面的新手)而且我尝试的方法没有用或者一团糟...

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

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

我希望脚本从 ImagesFolder运行

非常感谢!

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

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

将在目录树中名称以 .png.

结尾的每个常规文件上调用脚本

我可能会做的是:

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

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

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

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

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

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