我想将具有奇怪名称的文件重命名为合理的名称,但是我无法:/
$ mv *_000c.jpg 000c.jpg
mv: cannot move '?j?Z?R?C1_000c.jpg' to '000c.jpg': No such file or directory
我尝试过使用互联网上一些地方推荐的索引节点号:
$ ls -il *000c.jpg
ls: '?j?Z?R?C1_000c.jpg': No such file or directory
213915 -rw-r--r-- 1 wolf wolf 794655 Jul 21 2012 '?j?Z?R?C1_000c.jpg'
$ find . -inum 213915 -print0 | xargs -0 -I '{}' mv '{}' 000c.jpg
mv: cannot move './?j?Z?R?C1_000c.jpg' to '000c.jpg': No such file or directory
我应该怎么办?
答案1
相关评论摘要:
Unix 文件系统允许文件名中包含除\0
(nul) 和/
(正斜杠)之外的任何字符。显示问号的事实ls
只是因为它无法显示当前语言环境中文件名的某些字符(这也是原因之一你应该避免解析输出ls
)。
然而,对于 Samba 共享,您显然对文件名有比标准 Unix 文件系统更严格的要求。
由于该文件在中间 Samba 共享上的名称是“非法”的,因此在安装共享的计算机上无法通过其正确名称访问该文件。
这mv
不起作用,因为从 Samba 共享返回的用于扩展通配模式的名称不是托管文件系统上文件的实际名称,而只是 Samba 自己的名称损坏版本。
您的解决方案是登录实际托管该文件的服务器(在命名规则比 Samba 限制更少的文件系统上)并更改那里的文件名称。这是正确的做法。
另请参阅 Unix&Linux聊聊这个问题。
答案2
在学习 unix shell 中的引用之前,我会使用 emacsdired
模式来重命名或删除难以匹配的文件。您只需在 emacs 中打开该目录:
emacs -q .
...然后您可以使用箭头键导航到要修改的文件并将该文件重命名为R
. ?
将为您提供可用命令的列表(您也可以删除难以匹配的文件)。
然后你就C-x C-c
可以退出 emacs 了。
答案3
通常,对于不常见的文件名,您可以在文件名前添加“./”,Linux 将正确识别它。例如: $ ls ./?j?Z?R?C1_000c.jpg