
好吧,我是回答問題其中 OP 在 Ubuntu 中有多個儲存庫,可能會導致安裝不相關軟體時出現問題。我建議使用單一襯墊禁用 PPA,rename
然後按照一系列說明進行操作。一切都很好,我只是把這個問題留下來回答……不。結果rename
沒有達到我的預期:
sudo rename s/list/list\.disable/g /etc/apt/sources.list.d/*.list
有了這個,我期望重命名來查看以/etc/apt/sources.list.d/
結尾的任何文件.list
並將.list
其替換為.list.disable
.我用幾乎相同的命令得到了另一個答案,但OP從未給出回饋,而且我有點在沒有先測試的情況下就拋出了這個理論。因此,令我驚訝的是,OP 發現了該行的問題:
Can't rename /etc/apt/sources.list.d/iaz-battery-status-quantal.list /etc/apt/sources.list.disable.d/iaz-battery-status-quantal.list.disable: No such file or directory
Can't rename /etc/apt/sources.list.d/ubuntu-wine-ppa-quantal.list /etc/apt/sources.list.disable.d/ubuntu-wine-ppa-quantal.list.disable: No such file or directory
Can't rename /etc/apt/sources.list.d/webupd8team-java-raring.list /etc/apt/sources.list.disable.d/webupd8team-java-raring.list.disable: No such file or directory
我有一種奇怪的感覺,所以我自己測試了這個理論,並看到了相同的結果。然後,每當你遇到問題時,通常是正規表示式,不?我用很多扭曲的方式改變了正規表示式:
- s/.list/.list.disable/g
- s/.list/.list.disable/g
- /列表/列表.禁用/
- 其他我不記得的組合
好吧,我認為正規表示式不是問題,所以我瞪了選擇器,然後更改它/etc/apt/sources.list.d/*
並回收正規表示式測試。沒有喜悅。我有點沮喪touch some.list
並應用了我的命令
rename s/\.list/\.list\.disable/g *
答對了!現在我覺得渾身都被控制了。我修正了我的答案並繼續我的生活......不!這是不可接受的。為什麼?我查閱了手冊,令我驚訝的是,該手冊僅使用當前路徑範例。這是正常的嗎?還是只是功能沒有實現?或者我應該開始不相信我的理論?
答案1
使用該-n
參數在空運行模式下運行rename
,當您想要測試模式時,這非常有用:
martin@martin ~ % rename -n s/list/list.disable/g /etc/apt/sources.list.d/*.list | sed 's/renamed as/\n =>/g'
[...]
/etc/apt/sources.list.d/spotify.list
=> /etc/apt/sources.list.disable.d/spotify.list.disable
/etc/apt/sources.list.d/steam.list
=> /etc/apt/sources.list.disable.d/steam.list.disable
[...]
這裡明顯的錯誤是模式list
匹配,因此您嘗試重命名該資料夾及其包含的檔案。sources.list.d
請改用此模式:
rename -n 's/\.list$/.list.disable/' /etc/apt/sources.list.d/*.list | sed 's/renamed as/\n =>/g'
[...]
/etc/apt/sources.list.d/spotify.list
=> /etc/apt/sources.list.d/spotify.list.disable
/etc/apt/sources.list.d/steam.list
=> /etc/apt/sources.list.d/steam.list.disable
[...]
差異是:
.
在搜尋模式中引用 the\.
可以確保該點僅匹配真實的點,而不是任何字元(這就是正則表達式中未加引號的點通常所做的事情)。後面
$
的列表表示“字串結尾”。它確保只有檔案名稱末尾的“.list”匹配並被替換,而不是路徑或檔案名稱中其他位置的“.list”。您不需要在替換字串中引用點;因此,「.list.disable」無需反斜線即可工作,因為
.
那裡不再具有特殊意義。另請注意,我已用單引號引用了正規表示式,以防止 shell 以任何方式修改它。
答案2
問題在於g
,當您確實應該錨定模式時,卻使用了全域開關。正如你所寫的:
s/a/b/g
將字串中所有位置的 a 替換為 b。這導致您嘗試重新命名為不存在目錄的路徑。這也是為什麼當您在目錄中執行操作時問題消失了,因此只有一個匹配項可供替換。
我認為你可能打算錨定該模式
s/\.list$/.list.disable/
這將阻止嘗試將檔案移至不存在的目錄 /etc/apt/sources.list.disable.d/ 中(因此您無法將檔案移至其中)。