私はシェルスクリプトの初心者で、必要なことを実行しようとすると問題が発生します...
私はすべての*.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