在文件夹、子文件夹和多个文件中递归查找和重命名

在文件夹、子文件夹和多个文件中递归查找和重命名

我是 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

示例(不带pngnqoptipng

$ 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

相关内容