【问题标题】:What order does find(1) list files in?find(1) 列出文件的顺序是什么?
【发布时间】:2018-06-02 06:28:03
【问题描述】:

在 extfs 上,如果目录中只有文件创建而没有删除,我希望 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

上述sn-p的输出:

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/1b/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 个文件中的 100 个。我需要按照创建/修改的顺序(mtime)遍历这些文件和目录,并将每个文件通过管道传输到另一个进程以进行进一步处理。但我不一定要先创建一个包含大量文件的临时列表,然后根据mtime 对其进行排序,然后再将其传递给我的进程。

【问题讨论】:

    标签: find filemtime


    【解决方案1】:

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

    顺序可以是任何东西——字母顺序、mtimeatime、名称长度、权限或完全不同的顺序。排序甚至可以从一个列表到下一个列表。

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

    因此,如果您需要以特定方式对来自 find 的输出进行排序,那么您必须自己创建该命令。也许基于类似的东西:

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

    【讨论】:

    • 我试图避免sort 真的是一个“海绵过滤器”而不是一个“过滤器过滤器”——但无论如何。顺便说一句,xargs 可能比单个项目 -exec 更好。
    • 如果您需要全局排序(所有文件的mtime),那么“海绵”行为(sort 或其他)是不可避免的——您检查的最后一个文件可能是最旧的,因此最先被发射。回复xargs,当然,前提是您采取措施处理路径名中的空格和其他元字符,例如find ... -print0 | xargs -0 ...。此外,如果你真的在 Linux 上,那么 stat -c "%Y %n" 的开销比 ls -l 少。
    猜你喜欢
    • 2016-11-30
    • 2015-07-05
    • 2011-07-30
    • 2021-09-04
    • 1970-01-01
    • 2018-12-29
    • 2023-03-16
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多