我有点问题。一位客户委托我从一台非常旧的服务器迁移站点。不知道他们是如何到达那里的,但'
他们的名字中有文件。有没有办法重命名文件?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': 没有这样的文件或目录
此外,有没有简单的方法来改变\'
,以_
在某个文件夹中的所有文件?
如果您只需键入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)
如果任何文件将被覆盖,-i
将mv
提示。使用prename
(rename
在许多系统上链接到此):
prename -n 's:\\\\'\'':_:g' *"\\\\'"*
Run Code Online (Sandbox Code Playgroud)
-n
当你高兴的时候删除它正在做你想做的事。请注意,这里的反斜杠字符应该在 perl 表达式中转义,即使它们周围有单引号(如果没有单引号,您将需要八个反斜杠,因为 shell 会删除四个反斜杠而不是 perl 表达式的一部分)。