フォルダ、サブフォルダ、および複数のファイルで再帰的に検索して名前を変更する


3

私はシェルスクリプトを使い始めたばかりで、必要なことを実行しようとして問題が発生しています...

すべての* .png画像を「最適化」してthisを見つけたいので、次のように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やシェルスクリプトなど)と私がインターネットで見つけて試したものがうまくいかなかったか、完全に混乱していました...

私が持っているものをよりよく理解するには、次のようにします:

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を配置する必要があります。これは、サブフォルダーにスクリプトを実行するときに問題になる可能性がありますか?はいの場合、修正方法を教えていただけますか?

0

A bash script:

Create a new file find_and_rename and add the following lines:

  • version with 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
    
  • version with 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
    

Make the file executable with:

chmod +x find_and_rename

Go into your folder ImagesFolder.

Start the script in this folder with.

<path_to_script>/find_and_rename

Example (without pngnq and 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