我是 shellscript 的新手,在尝试做我需要做的事情时遇到了一些问题...
我想“优化”我的所有 *.png 图像,并发现这所以我按照它说的做了 bash:
#!/bin/bash
pngnq -vf -s1 *.png
rename -nq8.png .png *-nq8*
optipng -o7 *.png
这样做的目的是:
pngnq -vf -s1 *.png
获取示例 Image.png 的 *png 并创建一个名为 Image-nq8.png 的副本,该副本是经过优化的rename -nq8.png .png *-nq8*
使 Image-nq8.png 变成 Image.png,这样你就拥有了与以前相同但经过优化的内容(这样你就可以在文件夹中拥有与优化之前相同的内容)<=非常重要!optipng -o7 *.png
对 Images.png 进行另一次优化,无需进行任何复制。
但现在我有一个问题:
如果我按顺序在控制台中写入每一行,它可以在我所在的文件夹中正常工作,但现在我需要自动并递归地执行此操作。我解释一下我的情况:
注意:我说的文件夹是目录
我有一个名为 ImagesFolder 的文件夹,里面还有其他包含更多 *.png 的文件夹,我想在 ImagesFolder 的每个子文件夹中运行这个 bash,但我不知道该怎么做(正如我所说,我是 unix 和 shellscripts 等方面的新手)而且我在互联网上找到并尝试的方法不起作用或完全是一团糟......
为了更好地理解它,我所拥有的是这样的:
ImagesFolder
|-Folder1
| |- Folder12
| | |-20 images here
| |- Folder13
| | |- 10 images more here
| |- _Folder <- I have some folder names that start with '_'
| |- 5 images here
|-more images and folders and subfoldrs
这是结构,我希望脚本从 ImagesFolder 运行。
我尝试在其中使用 for 和 find,并在控制台中使用 find 调用脚本... 也尝试在堆栈中应用我在这里找到的一些示例,但没有任何效果... 可能是因为我真的不知道它是如何工作的,所以我不能就这样应用它。希望你能帮助我解决这个问题。
太感谢了!
编辑:要运行脚本,我必须转到 ImageFolder,打开控制台,然后chmod u+x name_of_my_script
将其放入子文件夹中,这会不会是个问题?如果是,您能告诉我如何修复它吗?
答案1
一个 Bash 脚本:
创建一个新文件find_and_rename
并添加以下行:
版本
replace
#!/bin/bash shopt -s globstar for f in **/*png; do pngnq -vf -s1 "$f" # Uncomment the line below for a test run # rename -v -n 's/^(.*)\-nq8(.*)/$1$2/' "$f" # Comment the line below out for a test run rename -v 's/^(.*)\-nq8(.*)/$1$2/' "$f" optipng -o7 "$f" done
版本
mv
#!/bin/bash shopt -s globstar for f in **/*png; do pngnq -vf -s1 "$f" # Uncomment the line below for a test run # echo "$f => ${f//-nq8/}" # Comment the line below out for a test run mv "$f" "${f//-nq8/}" optipng -o7 "$f" done
使用以下命令使文件可执行:
chmod +x find_and_rename
进入您的文件夹ImagesFolder
。
使用此文件夹中的脚本启动它。
<path_to_script>/find_and_rename
示例(不带pngnq
和optipng
$ find . -type f -name "*.png"
./Image-nq8.png
./sub/Image-nq8.png
./Image2-nq8.png
$ ./find_and_rename
Image2-nq8.png renamed as Image2.png
Image-nq8.png renamed as Image.png
sub/Image-nq8.png renamed as sub/Image.png
$ find . -type f -name "*.png"
./Image2.png
./sub/Image.png
./Image.png