web-dev-qa-db-ja.com

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

私はシェルスクリプトに慣れていないので、必要なことをしようとしていくつかの問題があります...

すべての* .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*makes 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これは、サブフォルダーに実行するのに問題になる可能性がありますか?はいの場合、修正方法を教えてください。

2
Megasa3

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
0
A.B.