在提出這個問題之前我做了很多研究。我找到了使用正則表達式進行批量重命名的不同鏈接,如下所示和其他類似的:
我的問題是這樣的,我想使用正規表示式進行批次重命名,但我的程式碼不起作用。
我在一個資料夾中有不同的文件,名稱如下:
name_house_1_door.jpg
name_house_2_door.jpg
name_house_3_door.jpg
name_house_4_door.jpg
我想像這樣重命名檔案:
name_house_1.jpg
name_house_2.jpg
name_house_3.jpg
name_house_4.jpg
最接近我想要的程式碼是:
$ rename -v 's/house\_[0-9]\_door/house_[0-9]/'
但正如您應該知道的那樣,第一個檔案被重新命名為:name_house_[0-9].jpg
答案1
一種更簡單的方法是_door
使用重命名來刪除:
rename -v 's/_door//' *
這會搜尋_door
並取代它,實質上是刪除它。
答案2
- 您在表達式的搜尋端轉義了下劃線,而不應該這樣做。
- 您需要子搜尋(數字)和占位符來儲存和使用子搜尋的結果。
在 [0-9] 周圍新增括號將建立所需的子搜尋。由於這是第一個子搜索,因此可以在替換端將其稱為 $1。結果如下..
rename -v 's/house_([0-9])\_door/house_$1/' *
希望這可以幫助。
答案3
你需要使用反向引用。字符類別在替換表達式中沒有任何意義。事實上,替換表達式中很少有字元具有特殊意義。我想是這樣的:
rename -v 's/house_([0-9])_door/house_$1/'
(或)
rename -v 's/(house_[0-9])_door/$1/'
另外,-n
在實際執行重新命名之前,請使用該標誌來查看會發生什麼。
答案4
這適用於 Fish Shell
for file in *.jpg;
mv -n $file (basename $file _door.jpg).jpg;
end