无法删除文件名带有“?”的文件,删除失败并显示“该文件不存在”消息。
我已经尝试通过终端使用
rm -f ./pathtofile\?.mkv
但尽管没有失败消息,文件仍然存在。有什么建议吗?
答案1
该文件的文件名中是否真的有一个,或者它是一个显示为的?
非打印字符?ls
?
$ touch $'a\ab' 'a?b'
$ ls
a?b a?b
一个文件的名称中有一个 ASCII BELL 字符,另一个文件的名称中有一个简单的问号。
新版本ls
可以默认以更清晰的形式显示特殊字符:
$ touch $'b\aa'
$ ls
'b'$'\a''a'
ls -q
ls
是旧版本默认显示非打印字符的方式。因此,如果您ls
在任何当前版本的 Ubuntu 中执行此操作,则可能只会看到问号。
请尝试以下方法之一:
$ ls -b
a?b a\ab
$ printf "%q\n" *
a\?b
$'a\ab'
如果其中任何一个的输出没有问号,那么文件名也没有问号。
您可以使用的输出printf
进行删除:
rm a\?b
rm $'a\ab'
或者依靠制表符补全:
$ rm a<tab>
a?b a^Gb
如果显示^G
,则按CtrlV然后CtrlG输入。或者告诉bash 循环显示制表符补全:
$ bind tab:menu-complete
$ rm a<tab>
$ rm a\?b<tab>
$ rm a^Gb
无论哪种情况,使用rm a?b
可以有效,但危险。它会匹配全部文件名以 开头a
,以 结尾b
,中间有一个字符:
$ touch acb; printf "%q\n" a?b
a\?b
$'a\ab'
acb
因此,如果您这样做rm a?b
(或更糟rm a*b
),您最终可能会删除您不想要的文件。
答案2
很?
可能是终端程序无法显示的另一个非 ASCII 符号,因此它会显示?
。这很容易证明 - 您可以执行touch ?.mkv
和rm ?.mkv
- 两个命令都可以正常执行。
使用 GUI 文件管理器可以轻松删除此类文件。
或者,您可以尝试使用通配符。如果命令:
ls pathtofile\FewLetters*.mkv
列出您可以安全运行的单个文件:
rm pathtofile\FewLetters*.mkv`.
最后,你可以尝试更难但更可靠的方法,如下所述无法删除文件名含有特殊字符的文件正如上面的 Android Dev 所指出的那样。
答案3
rm -f 'path?.mkv'
对我来说很管用。如果我错了请纠正我,但确实' '
会禁用某些特殊字符的功能,例如?
。抱歉格式不好,回复速度太快了。
希望它能有所帮助,祝你有美好的一天 =)
答案4
只需执行 ls -i 即可显示 inode。
然后执行 rm $(find . -inum inodeoffile)