如何删除名称中含有不可打印乱码的字符的文件
1.概述
有时,我们会遇到这样的情况:我们想删除那些文件名中带有某些字符的文件,如符号、空白、制表符和其他不可打印的字符。在这种情况下,我们通常不能用普通的rm
命令来执行删除等操作,特别是在使用基于ASCII的终端时。
在本教程中,我们将了解删除名称中含有不可打印字符的任何文件的常用有效方法。
2.查看不可打印的文件名
在尝试开始删除过程之前,我们首先应该以可接受的方式列出我们工作目录的内容,以了解到底发生了什么,以及如何处理删除任何目标对象的问题。
首先,让我们使用ls
命令来列出当前目录的内容。
$ ls
' ' __ ' μ '$'\342\220\264''Ξ'
'~$iscord.docx'
''$'\302\226' 'ω'$'\342\220\264'
''$'\302\226''Λ---ω' ␣␣␣␣␣␣␣␣
'?????::?' μ μ Ω Ω
值得注意的是,由于文件名中的罕见字符,输出结果是不寻常的,看起来是不对的。
因此,为了查看文件到名称的映射,我们将使用-l
选项,以获得粗略的长列表格式。
$ ls -l
total 13
-rw-r--r-- 1 ZZ 197121 4 Nov 6 07:08 ' '
-rw-r--r-- 1 ZZ 197121 162 Apr 16 2022 '~$iscord.docx'
-rw-r--r-- 1 ZZ 197121 6 Nov 6 06:03 ''$'\302\226'
-rw-r--r-- 1 ZZ 197121 4 Nov 6 06:01 ''$'\302\226''Λ---ω'
-rw-r--r-- 1 ZZ 197121 4 Nov 6 06:13 '?????::?'
-rw-r--r-- 1 ZZ 197121 4 Nov 6 06:12 __
-rw-r--r-- 1 ZZ 197121 4 Nov 6 06:14
-rw-r--r-- 1 ZZ 197121 4 Nov 6 06:18 'ω␣␦'$'\342\220\264'
-rw-r--r-- 1 ZZ 197121 4 Nov 6 06:16 ␣␣␣␣␣␣␣␣
-rw-r--r-- 1 ZZ 197121 4 Nov 6 06:26 ␣ μ μ Ω Ω
-rw-r--r-- 1 ZZ 197121 14 Nov 6 06:23 '␣ μ '$'\342\220\264''Ξ'
-rw-r--r-- 1 ZZ 197121 4 Nov 6 06:27
-rw-r--r-- 1 ZZ 197121 4 Nov 6 06:27
现在,输出结果对人更友好。然而,我们仍然可以预先假设,如果我们使用其中一个文件作为rm的参数,会有问题。毕竟,我们可以看到,甚至还有一些空白的名字。
3.使用ANSI-C引用
正如我们已经看到的,ls命令提供了一些帮助,它将几个文件名包围在ANSI-C引号样式。这清楚地表明,文件名有不可打印的字符。
在这种情况下,我们仍然可以使用标准的rm命令来删除一些项目。要做到这一点,我们只需传递ls所列出的确切名称。
$ rm ''$'\302\226'
我们还可以在用单引号括住文件名之前使用$特殊字符。
$ rm $'\356\200\215'
所以,的rm命令加上ANSI-C的引号,就能成功地删除数据。
现在,让我们把一个项目的名称传递给rm,而不使用ANSI-C的引号。
$ rm '\026\033'
rm: cannot remove '\026\033': No such file or directory
我们可以看到,shell抱怨说没有这样的文件或目录,出现了错误。
当然,将带有ANSI-C引号格式的文件名传递给rm命令,并不总是有效或高效。
4.使用节点号
在前面的ls输出中,我们不能简单地输入或复制一些文件名,所以我们可以删除它们。同样地,依靠标签完成来选择项目也是不行的。
同时,除了它们的路径之外,另一个唯一定义文件的属性是它们的inode编号。事实上,我们可以通过ls的-i选项,用它们唯一的inode号码来列出我们的项目。
$ ls -li
total 11
...
6517085 -rw-r--r-- 1 ZZ 197121 4 Nov 6 06:18 'ω␣␦'$'\342\220\264'
7826050 -rw-r--r-- 1 ZZ 197121 3 Nov 9 04:23 ''$'\356\200\215\356\200\215\356\200\215'
4685554 -rw-r--r-- 1 ZZ 197121 4 Nov 6 06:27
现在,ls命令在输出的第一列中打印出了inodes。
在这一点上,我们可以通过向find命令的–inum开关传递它的inode号来删除所需的文件。
$ find . -inum 4685554 -exec rm -i {} \;
rm: remove regular file './ '? y
在上面的代码片段中,我们已经执行了find -inum命令,通过其inode编号搜索目标文件。之后,-exec参数将选定的文件路径传递给rm进行删除。为了避免错误,我们还使用rm的-i标志来请求确认。
5.使用rm互动选项与Bash Globbing
使用globbing对我们的目的来说不是很有效,但当我们需要删除名称中含有不可打印字符的文件时,它绝对是有效的。
在这种方法中,我们将一个星号字符(shell glob)传递给rm命令,再加上-i 开关。这使得该命令翻阅我们目录中的所有内容,并有选择地删除我们确认的内容。
$ rm -i *
rm: remove regular file ' '?y
rm: remove regular file ' '?y
...
正如我们所看到的,rm中的交互式选项与*通配符参数将列出每个文件,并询问我们是否要将其删除。
6.使用Vim文本编辑器
令人惊讶的是,删除带有终端无法显示的字符的文件的另一个好方法是使用Vim文本编辑器。
为了实现这一目标,我们只需在所需的目录中运行vim即可。
$ vim .
接下来,我们可以通过使用Up和Down或J和K键在文件列表中导航。
选择目标文件后,我们只需使用Shift+D,输入y或yes,然后点击Return键就可以删除它。
7.结语
在这篇文章中,我们讨论了如何删除带有不能被终端显示的不可打印字符的文件。此外,我们还介绍了删除此类文件的常用方法。最后,我们学习了如何在删除过程中避免shell错误和其他异常问题。