我遇到了一点问题。一位客户要求我从一台非常旧的服务器上迁移站点。不知道他们是如何到达那里的,但'
他们的名字中有带有 的文件。有什么办法可以重命名文件吗?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: 无法 stat '90843_O\'ConnorPaul_GeneralManager.jpg': 没有这样的文件或目录
另外,是否有简单的方法可以更改\'
某个_
文件夹中的所有文件?
答案1
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 表达式的一部分)。
答案2
您可以用于rename
此类任务:
➜ lab ls
1dsfa.file 6033dsfa.file 90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file 90843_O\'ConnorPaul_GeneralManager.jpg
➜ lab rename "s/\'//g" *
➜ lab ls
1dsfa.file 6033dsfa.file 90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file 90843_O\\ConnorPaul_GeneralManager.jpg
如果你想替换'
你_
也可以使用重命名:
rename "s/\'/_/g" *
答案3
Grrr,@Graeme 打败了我,但我还是会发帖......
如果你用双引号引用文件名,比如mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg
,它就可以了; using-v
是可选的,但它会告诉你它做了什么。我相信除了转义所有字符之外还有第二种方法,如果可能的话。我知道这种方式的唯一缺点是 shell 会处理文本,因为它不在单引号内,但它根本不操作它,因为它不是内部代码,并且处理所需的额外时间毫无意义。
>
刚刚测试过,您可以在双引号文本中使用 char ,它将被视为文件名的一部分。
作为未来的提示,./
如果出现问题,您可以在文件名之前使用它,例如以破折号开头的文件:mv ./-file file
将重命名-file
为file
.在这种情况下,作为例外,您不能引用或转义文件名。
奇怪的是,90843_O'ConnorPaul_GeneralManager.jpg
如果我通过 转义单引号,我可以创建该文件\'
,但如果它不是双引号或转义,则不会创建它。
PS:Bash 补全是另一种方式,它解决了文件的文件名问题,但它不适用于“破折号”文件/文件夹:只需写下名称的一部分并按 Tab 键,它就会完成其余的工作。