如何在UNIX系统中删除带有特殊字符的目录名称和包含环境变量名称的目录

8
我在这个仓库中进行了搜索,没有找到任何相似的问题,可能是我的搜索错误了。
在我的客户环境中,一个自定义应用程序正在使用环境变量“$SRCDIR”和“$HOME”创建目录,并且创建这些目录的目录本身是 HOME 目录路径。如果我输入rm -rf $HOME,那么所有在当前目录下的 $HOME 中的文件和子目录都将被删除。如何删除这些不需要的目录。
-rw-r--r--  1 grp domain users 418051450 Apr 18 18:09 $SRCDIR
-rw-r--r--  1 grp domain users 418051450 Apr 18 18:09 $HOME

同时,有些目录名称是乱码字符,例如下面的例子。

-rwxr-xr-x  1 grp domain users  0 Feb  7  2106 ??????w?O???*????_6??t??Ó¡?>?tP??Ñ?|?C

如何删除它们?
8个回答

23

对于垃圾名称,最简单的方法是构建一个通配符来匹配它们。选择名称中的一个可读部分(例如_6子字符串),并将其用星号包裹起来。首先尝试一下:

ls *_6*

如果它仅仅列出了垃圾名称,请继续删除它:

rm *_6*

如果它列出了其他名称,请尝试使通配符更加具体,使用名称中的其他可读字符:

ls *w*_6*tP*N*x*

继续执行,直到您找到一个通配符只匹配不需要的文件为止。


@dicaprio 如果您对答案感到满意,请随意接受它。 - lanzz
@lazz,我可以接受您的评论作为答案,但这只解决了部分问题。第一个也是最重要的问题是如何删除带有“$HOME”的目录。$HOME是一个环境变量,它指向具有许多子目录的目录。 - dicaprio
你已经得到了@PavanManjunath的答案。我不会把他的答案复制到我的答案中。请随意接受我的答案或他的答案。 - lanzz
@dicaprio 它没有解决你的问题在哪里?rm抛出了什么错误? - Pavan Manjunath
1
我有一个名为“-P”的空文件夹,无论是“rmdir -P”还是“rmdir *P”都没有起作用。最终,“rmdir -- -P”解决了问题。“--”告诉“rmdir”将接下来的“-P”视为普通文件名。 - user2432405

18

确定必要文件/文件夹的i节点号:

# ls -ila 
14549980 drwxr-xr-x  3 root root       4096 Mar  5 20:45 ">?<

将其传输到rm管道中:

find . -inum 14549980  -exec rm -ir {} \;

这绝对是最好的答案:与被接受的答案相反,它不假设垃圾文件夹中有任何可读/可写字符!此外,该答案使用了 -i 开关进行交互式删除:这比被接受的答案建议的裸 rm 命令要好得多。完美的一行代码! - Vser

12
如果你创建了一个像 --rw-r-r-- 这样的目录来删除这个文件,请执行以下操作: rm -rf ./--rw-r-r--

5
UNIX命令rm(1)会将"--"后面的所有内容视为非选项。因此,您可以通过输入命令rm -fr -- --rw-r-r--来删除该目录。 - user195488
这个答案比通配符的更好。 - Randall Hunt

4

在Linux中尝试使用Zsh shell

[root@rhel5-8 ~]# zsh
[root@rhel5-8]~

然后使用制表符自动完成功能删除该目录。

或者如果使用Bash:

[root@rhel5-8 ~]# cd "??????w?O???*????_6??t??Ó¡?>?tP??Ñ?|?C???????>?̤-???y?X???N?x??H?????Ч)?n?5‌​??{@?~]?" 

进入该目录


如何删除名称类似于$HOME的目录。 - dicaprio
这很好用。我发现一个名为“?”的目录,Bash无法删除它,但zsh可以。 - Dustin Butler

3

只需要转义美元符号,可以尝试像这样-

rm -rf \$HOME

与其他符号一样,即使是 ? 符号也一样。

我尝试了 rm \?,它显示了以下内容:rm: 无法删除 ?': 没有那个文件或目录`。 - dicaprio
ls -al 会显示 ? 作为一个文件吗?从错误信息中可以看出,rm 确实将 ? 视为一个文件,但无法找到它。 - Pavan Manjunath
这是我看到的文件名,??????w?O???*????_6??t??Ó¡?>?tP??Ñ?|?C?????(??>?̤-???y?X???N?x??H?????Ч)?n?5??{@?~]??Z?o??????* - dicaprio
很抱歉,您需要转义所有特殊字符。不仅是第一个 ?。如果您的 Shell 支持制表符自动完成,则无需费太多功夫! - Pavan Manjunath
我怀疑问号实际上是终端编码中无法显示的字符,而不是真正的问号。 - lanzz

3
你可以尝试使用 rm -rf '$HOME' '$SRCDIR' 命令,因为单引号会防止 shell 变量的扩展。已在 bash 和 ksh 中尝试过。

0

您可以使用C程序来避免Shell/转义问题。请查看此问题的答案。


我认为这并没有帮助。 - dicaprio
我浏览了所有的答案,但在这种情况下,$PINHOME目录不会被展开吗? - dicaprio
例如,当我执行 os.listdir('$USER') 时,它会尝试查找名为 '$USER' 的文件夹,这是不应该的。 因此,在您的情况下,可以轻松执行以下操作: import shutil shutil.rmtree('/folder_name') - Bogolt

0

替代Inode方法:

ls -ila

注意Inode号码,例如1234567

rm -r $(find -inum 1234567)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接