rm:拒绝删除“.”或“..”目录:跳过“..”

rm:拒绝删除“.”或“..”目录:跳过“..”

为什么当我尝试..从目录中删除时会收到错误:

rm: refusing to remove '.' or '..' directory: skipping '..'

在你问我为什么要这样做之前:只是因为。

答案1

那是在 的大多数实现中添加了一个保护措施,rm以解决某些 shell(包括 POSIX shell)的错误功能,其中也会递归地删除和rm -rf .*的内容...(这是由 Forsyth shell 和衍生物(如 pdksh)修复的,zsh并且fish至少是 1)。

您可以使用(没有该错误功能的外壳)rm的内置功能。zsh

zmodload zsh/files # to load and enable the builtin version of rm
                   # and a few other utilities
rm -rf ..

或者,使用 BSD 或 GNUfind或兼容版本,您可以执行以下操作:

find .. -delete

需要明确的是,这些删除了父目录(包括当前工作目录)的内容(递归地)。

如果您想取消该..条目与当前目录的链接(通常在现代系统上),则不能。只要包含它们的目录存在并且无法删除,它们就始终存在...在某些文件系统上,它们甚至是虚拟的(不是目录文件中的物理条目)。

即使您设法删除它们(例如通过debugfs手动编辑目录内容),它们也会在下次完成文件系统检查(fsck)时重新创建,并且某些应用程序(例如cdPOSIX shell 的内置)甚至会忽略它们完全(无论当前目录中是否有文件,cd ..都会从存储的当前工作目录的尾部删除一个路径组件),并且 POSIX 需要$PWD....给系统调用的路径名参数表示父目录,无论是否存在当前(或相应的对于像dir/../whatever) 目录这样的路径。


1 在 5.2 版本中,bash添加了一个globskipdots选项来修复该问题。

答案2

我认为您想要的命令是:rm -rf * 我认为这rm -rf .*也适用于隐藏文件?没有把握。

但请确保您位于要运行此程序的当前目录中。换句话说,输入pwdecho $PWD以确保......

是的,这将删除当前目录中的所有文件。

我也确信rm -rf ../*会起作用,因为我已经测试过了。您可以根据需要添加任意数量的父目录(“../”)。

所以基本上,只需在末尾添加一个“splat”即可绕过愚蠢的安全性。

相关内容