我是 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
範例(沒有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