如何删除文件名有 utf-8 字符问题的文件

mah*_*ich 3 linux bash rm

我想通过bash rm命令从服务器中删除文件。

这是一个示例文件Test_ Mürz.jgp

如何大规模删除文件名中带有此类字符问题的文件……尤其是当您不知道字符的位置时。

use*_*ser 14

对于单个文件或小文件集,如果通配符通配符不允许您达到所需的精度,您可以组合ls -i(或stat,如果可用)和find -inum.

为了安全起见,在使用 find's 时-inum,请务必同时使用-xdev将搜索限制为单个文件系统。不这样做可能会产生意想不到的结果。

例如:

~$ ls -i myweirdfile
183435818 myweirdfile
~$ find . -xdev -inum 183435818 -exec rm -i '{}' ';'
rm: remove regular file `./myweirdfile'? y
~$
Run Code Online (Sandbox Code Playgroud)

或者,在单个调用中(这可能取决于 GNU coreutils stat,这在 Linux 上应该是一个相当安全的假设,并使用 sh 样式的进程替换):

~$ find . -xdev -inum $(stat -c '%i' 'myweirdfile') -exec rm -i '{}' ';'
rm: remove regular file `./myweirdfile'? y
~$
Run Code Online (Sandbox Code Playgroud)

您还可以使用 find 的-delete操作而不是-exec'ing rm。对于非常奇怪的文件名,这可能更安全。使用-print-lsfirst 来验证将删除哪个文件。类似于以下内容:

~$ ls -i myweirdfile
183435818 myweirdfile
~$ find . -xdev -inum 183435818 -print
./myweirdfile
~$ find . -xdev -inum 183435818 -delete
~$ find . -xdev -inum 183435818 -print
~$
Run Code Online (Sandbox Code Playgroud)

请记住,硬链接对多个名称使用相同的 inode 编号,因此您要确保在任何地方都没有被删除的杂散附加名称(显然,除非您这样做)。

  • @lzprgmr 因为对于 GNU coreutils rm,`rm -i` 会导致 rm 为每个文件删除提示一次,确保您不会意外删除错误的文件(* 很容易* 错误输入 inode 编号!)。由于问题被标记为“linux”,我认为假设 GNU coreutils 是合理的。 (2认同)

小智 5

简单的方法:

ls -i Test_*

rm -i [inode number]
Run Code Online (Sandbox Code Playgroud)

  • 这是什么“rm”程序?对于 GNU coreutils 中的 `rm`,`-i` 表示“每次删除之前提示”。 (7认同)