在資料夾、子資料夾和多個檔案中遞歸查找和重新命名

在資料夾、子資料夾和多個檔案中遞歸查找和重新命名

我是 shellscript 新手,在嘗試做我需要的事情時遇到了一些問題...

我想“優化”我所有的 *.png 圖像並發現所以我照它的說法做了bash:

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

這是做什麼的:

  • pngnq -vf -s1 *.png採用 *png ofr 範例 Image.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 ,並在控制台中查找調用腳本...也嘗試應用我在堆疊中找到的一些示例,但什麼都沒有...可能是因為我真的不知道如何這項工作我不能就這樣應用它。希望你能幫我解決這個問題。

太感謝了!

編輯:要運行腳本,我必須轉到 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

相關內容