Rename
用下劃線替換文件名中的點,保持副檔名不變
我有一個 bash 腳本,我試圖用它來替換文件名中的點並用下劃線替換它們,使副檔名保持不變(我在 Centos 6 順便說一句)。從下面的輸出中可以看出,當有一個點要替換時,腳本可以工作,但是在唯一的點是副檔名的情況下,腳本仍然會嘗試重命名文件,而不是忽略它。誰能指出我應該如何更好地處理這個問題?謝謝你的幫助。
我的(錯誤的)腳本:
#!/bin/bash for THISFILE in * do filename=${THISFILE%\.*} extension=${THISFILE##*\.} newname=${filename//./_} echo "mv $THISFILE ${newname}.${extension}" #mv $THISFILE ${newname}.${extension} done
樣本輸入:
1.3MN-Pin-Eurotunnel-Stw505.51.024-EGS-130x130.jpg Wear-Plates.jpg
輸出:
mv 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg mv Wear-Plates_jpg.Wear-Plates_jpg Wear-Plates_jpg.Wear-Plates_jpg
我相信這個程序會做你想做的。我已經對其進行了測試,它適用於幾個有趣的案例(例如根本沒有擴展):
#!/bin/bash for fname in *; do name="${fname%\.*}" extension="${fname#$name}" newname="${name//./_}" newfname="$newname""$extension" if [ "$fname" != "$newfname" ]; then echo mv "$fname" "$newfname" #mv "$fname" "$newfname" fi done
您遇到的主要問題是
##
擴展沒有按照您的意願進行。我一直認為 bash 中的 shell 參數擴展是一種魔法。手冊中的解釋並不完全清楚,並且缺乏任何關於擴展應該如何工作的支持範例。它們也相當神秘。就個人而言,我會寫一個
sed
小腳本來按我想要的方式修改名稱,或者寫一個小腳perl
本來完成整個事情。其他回答的人之一採取了這種方法。我想指出的另一件事是我對引用的使用。每次我使用 shell 腳本做任何事情時,我都會提醒人們在引用時要非常小心。shell 腳本中一個巨大的問題來源是 shell 解釋了它不應該解釋的東西。引用規則遠非顯而易見。我相信這個 shell 腳本沒有引用問題。