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

Igo*_*ych 11 quoting rename

我有点问题。一位客户委托我从一台非常旧的服务器迁移站点。不知道他们是如何到达那里的,但'他们的名字中有文件。有没有办法重命名文件?mv似乎没有办法。

ls 显示为 90843_O\\'ConnorPaul_GeneralManager.jpg

当我尝试

 mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg
Run Code Online (Sandbox Code Playgroud)

它对>新行中的没有任何作用,就好像在等待更多输入一样。

如果我尝试

mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg
Run Code Online (Sandbox Code Playgroud)

我收到错误

mv: 无法统计 '90843_O\'ConnorPaul_GeneralManager.jpg': 没有这样的文件或目录

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

Gra*_*eme 6

如果您只需键入mv 90843_O并按 Tab,Bash 选项卡完成应该能够在这里做正确的事情。否则,正确转义名称的一种方法是:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg
Run Code Online (Sandbox Code Playgroud)

双引号不需要转义',但仍然需要转义两个反斜杠字符(每个额外的反斜杠构成四个反斜杠)。另一种选择是:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg
Run Code Online (Sandbox Code Playgroud)

这里将反斜杠放在单引号中消除了对它们进行转义的需要,但您需要结束单引号以添加文字'. 这是在引号结束后转义的。

请注意,这里的问题与名称中的反斜杠和单引号有关。\\'使用循环替换目录中所有文件的序列(因为问题中的文件名中有两个反斜杠,两者都会导致问题):

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done
Run Code Online (Sandbox Code Playgroud)

如果任何文件将被覆盖,-imv提示。使用prenamerename在许多系统上链接到此):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*
Run Code Online (Sandbox Code Playgroud)

-n当你高兴的时候删除它正在做你想做的事。请注意,这里的反斜杠字符应该在 perl 表达式中转义,即使它们周围有单引号(如果没有单引号,您将需要八个反斜杠,因为 shell 会删除四个反斜杠而不是 perl 表达式的一部分)。