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


11

我有点问题。一位客户委托我从一台真正的旧服务器上迁移网站。不知道他们是怎么到达那里的,但是有一些文件'名。有什么办法可以重命名文件吗?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':没有此类文件或目录

此外,有没有简单的方法来改变\',以_在某个文件夹中的所有文件?


1
如果您有moreutils,它vidir是解决此类问题的简单解决方案。
derobert 2014年

Answers:


6

如果仅键入mv 90843_O并按Tab,Bash选项卡补全应该可以在此处执行正确的操作。否则,一种正确转义名称的方法是:

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表达式内转义反斜杠字符(如果没有单引号,您将需要八个反斜杠,因为外壳会删除四个反斜杠而不将其作为perl表达式的一部分)。


4

您可以使用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" *

-2

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,其余的就可以了。


为什么要投票?我在其他人之前写书,但是我不够快才能把它先发布。
rautamiekka 2014年

不是我 不知道谁投了反对票。
Igor Yavych 2014年

1
这个答案是不对的,它忽略了文件名中的反斜杠,这些反斜杠实际上比单引号更难处理。
Graeme 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.