Rename

重命名名稱中帶有引號的文件

  • April 6, 2014

我有點問題。一位客戶要求我從一台非常舊的伺服器遷移站點。不知道他們是如何到達那裡的,但有一些文件以'他們的名字命名。有沒有辦法重命名文件?mv似乎沒有奏效。

ls顯示為90843_O\\'ConnorPaul_GeneralManager.jpg

當我嘗試

mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

它對新行中的 沒有任何作用,>就好像在等待更多輸入一樣。

如果我嘗試

mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

我得到錯誤

mv: 無法統計 ‘90843_O'ConnorPaul_GeneralManager.jpg’: 沒有這樣的文件或目錄

另外,是否有簡單的方法可以更改某個文件夾\'_的所有文件?

mv 90843_O如果您只需鍵入並按 Tab,Bash tab 完成應該能夠在這裡做正確的事情。否則,正確轉義名稱的一種方法是:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

雙引號消除了轉義的需要',但是兩個反斜杠字元仍然需要轉義(每個額外的反斜杠產生四個反斜杠)。另一種選擇是:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

在這裡將反斜杠放在單引號中無需轉義它們,但您需要結束單引號以添加文字'. 這在引號結束後被轉義。

請注意,這裡的問題與名稱中的反斜杠和單引號一樣多。要\\'使用循環替換目錄中所有文件的序列(因為問題中的文件名中有兩個反斜杠,兩者都會導致問題):

for file in *"\\\\'"*; do
 mv -i "$file" "${file//"\\\\'"/_}"
done

如果任何文件將被覆蓋,-i它將提示。在許多系統上mv使用prename(指向此的連結):rename

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

當你高興時刪除-n它正在做你想做的事。請注意,反斜杠字元應在此處的 perl 表達式中進行轉義,即使它們周圍有單引號(如果沒有單引號,您將需要八個反斜杠,因為 shell 將刪除四個反斜杠,而不是 perl 表達式的一部分)。

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