删除名称以“?”开头的文件在命令行中

删除名称以“?”开头的文件在命令行中

我在 Debian stable、Cinnamon DE 下运行,我有一些文件想用命令行删除(现在我用 Nemo 删除这些文件)。

例如,这些.txt文件以“?”开头在 shell 和 Nemo 中这个“?”被替换为回车:

$@debian: ls
ssolveIncpUL46pK  ?ssolveIncpUL46pK.txt

尼莫

我试过:

 rm ?ss*
 rm \?ss*
 rm \ ss*

答案1

删除此类文件的适当方法是使用inode文件的值。

使用以下命令获取inode

 ls -li 

 12582925 -rw-r--r--  1 root root   646 May 23 02:19 ?ssolveIncpUL46pK.txt

长列表结果的第一个字段是 inode 值。

然后使用find命令删除文件wrt inode。

find . -inum 12582925 -exec rm -i {} \;

答案2

这个角色不是一个问号。该ls实用程序将用 替换不可打印的字符?。还不清楚不可打印字符是否真的是第一的文件名中的字符或前面是否有一个或多个空格。

如果您想删除这两个文件,您可以将“坏部分”与 匹配*,然后更紧密地指定可见文件名的其余部分:

rm -i ./*ssolve*

这将首先将给定模式扩展到与其匹配的所有文件名,然后rm删除它们。如果存在您需要的文件,请更加具体并指定文件名的较长部分想要删除与上述短模式匹配的内容,例如

rm -i ./*ssolveIncpUL46pK*

这是假设您与要删除的文件位于同一目录中。

-i选项rm使其在实际删除任何内容之前要求确认。

答案3

不建议使用a*来删除文件。它可以匹配比您喜欢的更多。

在 Debian 中,ls(来自 GNU)命令能够以引号形式打印文件的值[1]

$ ls -Q
"\nssolve"  "\n\nssolve"  "y"  "z"

或者,更好的是,列出带有引号的名称和 inode 的文件:

$ ls -iQ
26738692 "\nssolve"  26738737 "\n\nssolve"  26738785 "y"  26738786 "z" 

然后,使用 rm 和 inode 编号来确保仅删除正确的文件:

$ find . -xdev -inum 26738737 -exec rm -i {} \;

对 find 的调用仅限于一个文件系统 ( -xdev),以避免与其他文件系统上具有相同索引节点号的文件相匹配。另请注意,rm正在使用-i(交互式)选项调用,因此它将在命令行中询问是否应删除每个文件。


[1]请注意,这并不能解决视觉上令人困惑的字符问题,例如西里尔字母а($'\U430') 和拉丁字母a($'\U61') 看起来完全相同,但实际上并非如此。为了更好地查看文件名使用的字节,我们需要使用十六进制查看器;

$ touch а a é $'e\U301' $'\U301'e
$ ls
a  ́e  é  é  а              # what you "see" here depends on your system.

$ printf '<%s>' * | od -An -c
   <   a   >   < 314 201   e   >   <   e 314 201   >   < 303 251
   >   < 320 260   >

相关内容