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

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

私はシェルスクリプトの初心者で、必要なことを実行しようとすると問題が発生します...

私はすべての*.png画像を「最適化」したいのですが、これそこで、次のようにbashを作成しました:

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

これは何をするのでしょうか:

  • pngnq -vf -s1 *.png*png形式の画像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 やシェルスクリプトなどの初心者です)。インターネットで見つけて試したものは機能しなかったか、完全に混乱していました...

より理解しやすいように、次のようなものを用意しました。

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

関連情報