rm * 的删除行为

rm * 的删除行为

如果我rm *在包含文件的目录中执行操作,是否只会删除此目录中的文件?或者星号是否/也包括文件系统根目录?

答案1

就像普通文件名引用当前目录中的项目一样,*它也会扩展为当前目录中的项目。没有机制可以让它包含/在结果中。(您可以随时使用echo *. 进行测试)

因此,当前目录中的所有文件都将被删除,但目录将保留,因为您没有指定递归删除目录的选项(-r)。

如果使用启用递归模式rm -r然后文件和子目录将被删除 - 但程序只会向下移动,而不会向上移动。(rm 总是跳过..引用“父目录”的项目。事实上,在 Linux 上,即使你故意尝试,rm -r ..它也会显示警告并拒绝这样做。)

答案2

要确认*当前 shell 扩展的内容,请运行:

echo *

默认情况下,它仅包含当前文件夹中的非隐藏文件/目录。对于隐藏文件,请设置dotglob


但是,如果你运行:

echo .*

默认情况下,它将包括所有隐藏文件以及当前文件夹(.)和父文件夹(..)。

有关解决方法,请参见:如何在 bash 中使用 .* 通配符但排除父目录 (..)?

相关内容