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

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

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

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

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

答案1

对于单个文件或小组文件,如果通配符通配符不能满足您认为需要的精度,则可以组合ls -i(或stat,如果可用)和find -inum

为了安全起见,使用 find 时-inum,请务必确保还使用-xdev将搜索限制在单个文件系统中。不这样做可能会产生意外结果。

例如:

~$ ls -i myweirdfile
183435818 myweirdfile
~$ find . -xdev -inum 183435818 -exec rm -i '{}' ';'
rm: remove regular file `./myweirdfile'? y
~$

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

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

您也可以使用 find 的-delete操作,而不是-execrm。对于非常奇怪的文件名,这可能更安全。首先使用-print-ls来验证将删除哪个文件。如下所示:

~$ ls -i myweirdfile
183435818 myweirdfile
~$ find . -xdev -inum 183435818 -print
./myweirdfile
~$ find . -xdev -inum 183435818 -delete
~$ find . -xdev -inum 183435818 -print
~$

请记住,硬链接对多个名称使用相同的 inode 编号,因此您要确保没有任何多余的名称被删除(除非您显然要做到这一点)。

答案2

简单的方法:

ls -i Test_*

rm -i [inode number]

答案3

您有什么“宏伟”目标?

这为什么还不够呢?

$ rm Test_*

深入文件目录树的一种方法:

$ find /your/base/dir -maxdepth 3 -type f -name 'Test_*' -exec rm {} \;

您可以调整 find 命令来精确查找您的文件。

答案4

有三种方法:

  1. 使用 inode 来识别文件名。首先执行 ls 命令并检查 inode 文件,如上所述
  2. 对于新手来说,可以使用 Midnight Commander :)
  3. 您必须转义特殊字符。空格(_ 为了视觉效果)_ 您将其替换为 _ ,以及其他字符。
  4. 您可以使用 bash 扩展。在开始时写入开头:rm Test_ 并按 TAB 键。它们会立即扩展转义字符以获得唯一名称,或为您显示非唯一名称的可能性。然后您将看到如何在命令行中编写特殊字符。
  5. 您可以通过转义:somename\263\261rest_of_name 来转义unicode。您可以使用十进制字符代码进行转义。

相关内容