Rename

用下劃線替換文件名中的點,保持副檔名不變

  • March 17, 2018

我有一個 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 腳本沒有引用問題。

引用自:https://unix.stackexchange.com/questions/56771