无法删除文件名中带有“?”的文件

无法删除文件名中带有“?”的文件

无法删除文件名带有“?”的文件,删除失败并显示“该文件不存在”消息。

我已经尝试通过终端使用

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 -qls是旧版本默认显示非打印字符的方式。因此,如果您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 ?.mkvrm ?.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)

相关内容