Bra*_*iam 1 perl regular-expression rename
好的,我正在回答一个问题,即 OP 在 Ubuntu 中有多个存储库,这些存储库可能会导致安装无关软件的问题。我建议使用单个衬垫禁用 PPA,rename然后按照一系列说明进行操作。一切都很好,我只是把这个问题留在后面作为回答......不。结果rename不符合我的预期:
sudo rename s/list/list\.disable/g /etc/apt/sources.list.d/*.list
Run Code Online (Sandbox Code Playgroud)
有了这个,我很期待命名寻找到/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
Run Code Online (Sandbox Code Playgroud)
我有一种奇怪的感觉,所以我自己测试了这个理论,并看到了相同的结果。然后,每当您遇到问题时,通常都是正则表达式,不是吗?我以多种扭曲的方式更改了正则表达式:
好吧,我认为正则表达式不是问题所在,所以我瞪着选择器,将其更改为/etc/apt/sources.list.d/*并循环使用正则表达式测试。没有喜悦。有点沮丧我这样做touch some.list并应用我的命令
rename s/\.list/\.list\.disable/g *
Run Code Online (Sandbox Code Playgroud)
答对了!现在我觉得整个人都被控制了。我修正我的答案并继续我的生活......不!这是不可接受的。为什么?我查找手册,令我惊讶的是它只使用了当前路径示例。这是正常的吗?或者只是该功能没有实现?或者我应该开始不相信我的理论?
使用该-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
[...]
Run Code Online (Sandbox Code Playgroud)
这里明显的错误是模式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
[...]
Run Code Online (Sandbox Code Playgroud)
区别在于:
.在搜索模式中引用as\.确保点只匹配真正的点,而不匹配任何字符(这是正则表达式中未加引号的点通常所做的)。
该$列表的意思是“字符串的结束”之后。它确保只有文件名末尾的“.list”匹配并被替换,而不是路径或文件名中其他位置的“.list”。
您不需要在替换字符串中引用点;“.list.disable”因此无需反斜杠即可工作,因为.那里不再具有特殊含义。
另请注意,我在单引号中引用了正则表达式,以防止 shell 以任何方式修改它。