如果我rm *
在包含文件的目录中执行操作,是否只会删除此目录中的文件?或者星号是否/
也包括文件系统根目录?
答案1
就像普通文件名引用当前目录中的项目一样,*
它也会扩展为当前目录中的项目。没有机制可以让它包含/
在结果中。(您可以随时使用echo *
. 进行测试)
因此,当前目录中的所有文件都将被删除,但目录将保留,因为您没有指定递归删除目录的选项(-r)。
如果使用启用递归模式rm -r
,然后文件和子目录将被删除 - 但程序只会向下移动,而不会向上移动。(rm 总是跳过..
引用“父目录”的项目。事实上,在 Linux 上,即使你故意尝试,rm -r ..
它也会显示警告并拒绝这样做。)
答案2
要确认*
当前 shell 扩展的内容,请运行:
echo *
默认情况下,它仅包含当前文件夹中的非隐藏文件/目录。对于隐藏文件,请设置dotglob
。
但是,如果你运行:
echo .*
默认情况下,它将包括所有隐藏文件以及当前文件夹(.
)和父文件夹(..
)。
有关解决方法,请参见:如何在 bash 中使用 .* 通配符但排除父目录 (..)?