重命名名称中带有引号 ' 的文件

重命名名称中带有引号 ' 的文件

我遇到了一点问题。一位客户要求我从一台非常旧的服务器上迁移站点。不知道他们是如何到达那里的,但'他们的名字中有带有 的文件。有什么办法可以重命名文件吗?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使用prenamerename在许多系统上链接到此):

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将重命名-filefile.在这种情况下,作为例外,您不能引用或转义文件名。

奇怪的是,90843_O'ConnorPaul_GeneralManager.jpg如果我通过 转义单引号,我可以创建该文件\',但如果它不是双引号或转义,则不会创建它。

PS:Bash 补全是另一种方式,它解决了文件的文件名问题,但它不适用于“破折号”文件/文件夹:只需写下名称的一部分并按 Tab 键,它就会完成其余的工作。

相关内容