为什么当我尝试..
从目录中删除时会收到错误:
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
)时重新创建,并且某些应用程序(例如cd
POSIX shell 的内置)甚至会忽略它们完全(无论当前目录中是否有文件,cd ..
都会从存储的当前工作目录的尾部删除一个路径组件),并且 POSIX 需要$PWD
..
..
给系统调用的路径名参数表示父目录,无论是否存在当前(或相应的对于像dir/../whatever
) 目录这样的路径。
1 在 5.2 版本中,bash
添加了一个globskipdots
选项来修复该问题。
答案2
我认为您想要的命令是:rm -rf *
我认为这rm -rf .*
也适用于隐藏文件?没有把握。
但请确保您位于要运行此程序的当前目录中。换句话说,输入pwd
或echo $PWD
以确保......
是的,这将删除当前目录中的所有文件。
我也确信rm -rf ../*
会起作用,因为我已经测试过了。您可以根据需要添加任意数量的父目录(“../”)。
所以基本上,只需在末尾添加一个“splat”即可绕过愚蠢的安全性。