找到(1)列表文件的顺序是什么?

时间:2018-06-02 06:28:03

标签: find filemtime

在extfs上,如果目录中只有文件创建和没有--deletions,我希望find . -type f按照创建时间顺序(或mtime)列出文件,或者如果没有,至少按照他们的反向时间顺序...取决于如何遍历目录的内容。

但这不是我所看到的行为。

以下代码,例如,创建一组新的目录和文件:

#!/bin/bash -u

for i in a/ a/{1,2,3,4,5} b/ b/{1,2,3,4,5}; do
    if echo "$i" | egrep -q "/$"; then
        echo "Creating dir $i"
        mkdir -p "$i"
    else
        echo "Creating file $i"
        touch "$i"
    fi
    sleep 0.500
done

上述代码段的输出:

Creating dir a/
Creating file a/1
Creating file a/2
Creating file a/3
Creating file a/4
Creating file a/5
Creating dir b/
Creating file b/1
Creating file b/2
Creating file b/3
Creating file b/4
Creating file b/5

但是,find按随机顺序列出文件。例如,a/2不会跟随a/1,而b/2不会跟随b/1

$ find . -type f
./a/1
./a/3
./a/4
./a/2   <----
./a/5
./b/1
./b/3
./b/4
./b/2   <----
./b/5

知道为什么会这样吗?

我的主要问题是:我有一个非常大的卷,可以存储100个1000个文件。我需要按照创建/修改(mtime)的顺序遍历这些文件和目录,并将每个文件传递给另一个进程以进行进一步处理。但是,我不一定要先创建这个大型文件集的临时列表,然后在将其汇总到我的进程之前根据mtime对其进行排序。

1 个答案:

答案 0 :(得分:1)

find按基础文件系统实现报告的顺序列出对象。您可以通过传递ls选项告诉-f向您显示此“原始”订单。

订单可以是任何内容 - 按字母顺序排列,按mtime,按atime,按名称长度,按权限或完全不同的顺序排列。订单甚至可能因列表而异。

文件系统通常以反映文件系统将目录槽分配给文件的策略的顺序进行报告。如果这是基于文件名的某种基于散列的策略,那么该顺序可能看起来是荒谬的。这是广泛使用的Linux和BSD文件系统实现所发生的情况。由于你提到 extfs ,这可能是导致你看到的顺序的原因。

因此,如果您需要以特定方式订购find的输出,那么您必须自己创建该订单。也许基于以下内容:

  find . -type f -exec ls -ltr --time-style=+%s {} \; | sort -n -k6