我想通过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 编号,因此您要确保在任何地方都没有被删除的杂散附加名称(显然,除非您想这样做)。
小智 5
简单的方法:
ls -i Test_*
rm -i [inode number]
Run Code Online (Sandbox Code Playgroud)