通过 rm -f 使用 glob 模式删除时,哪个文件首先被删除?

通过 rm -f 使用 glob 模式删除时,哪个文件首先被删除?

我有一个包含数千个具有以下模式的文件的文件夹: YYYYMMDD_HH24MISS_4DIGITSEQUENCE

例子:20180626_210123_0001

现在,例如,当我通过 rm -f *20180626_1*命令删除时,它工作正常。

我的问题是: 1. 首先删除哪个文件? 2. 是随机抽取的吗? 3. 如果它在选择时保持某种顺序,那么它会选择哪一个以及如何决定?

答案1

shell 按字典顺序(在当前语言环境中)扩展 Glob,其rm实现是可能以按照获取文件的相同顺序删除作为参数获取的文件。因此,在您的情况下,文件将从最旧的开始被删除。

对 glob 结果进行排序POSIX 要求。在快速测试中,至少 GNU rm 会按列出的顺序删除命令行上给出的文件,并且不会对递归操作期间找到的文件进行排序。

答案2

shell 在执行之前会扩展表达式rm,并且该扩展并不特定于该命令,因此如果您这样做:

echo *20180626_1*

那么第一个 echo 的东西将是 shell 传递给的第一个东西rm。顺序不是随机的,而是按字母顺序排列的。从 bash 手册页:

分词后,除非设置了 -f 选项,否则 bash 会扫描每个单词中的字符 *、? 和 [。如果出现这些字符之一,则该单词被视为一种模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。

相关内容