find(1) 以什么顺序列出文件?
What order does find(1) list files in?
在 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
以上片段的输出:
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 个文件。我需要按照 creation/modification (mtime
) 的顺序遍历这些文件和目录,并将每个文件通过管道传输到另一个进程以进行进一步处理。但我不一定要先创建这个大型文件集的临时列表,然后在将其通过管道传输到我的进程之前根据 mtime
对其进行排序。
find
按照底层文件系统实现报告的顺序列出对象。您可以告诉 ls
向您显示此 "raw" 订单,方法是将其传递给 -f
选项。
顺序可以是任何顺序——按字母顺序、mtime
、atime
、名称长度、权限或完全不同的顺序。顺序甚至可以从一个列表到下一个不同。
文件系统通常以反映文件系统为文件分配目录槽的策略的顺序进行报告。如果这是某种基于文件名的基于散列的策略,那么顺序可能显得毫无意义。这就是广泛使用的 Linux 和 BSD 文件系统实现所发生的情况。既然你提到了 extfs 这可能就是导致你看到的顺序的原因。
因此,如果您需要以特定方式对 find
的输出进行排序,则您必须自己创建该顺序。也许基于类似的东西:
find . -type f -exec ls -ltr --time-style=+%s {} \; | sort -n -k6
在 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
以上片段的输出:
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 个文件。我需要按照 creation/modification (mtime
) 的顺序遍历这些文件和目录,并将每个文件通过管道传输到另一个进程以进行进一步处理。但我不一定要先创建这个大型文件集的临时列表,然后在将其通过管道传输到我的进程之前根据 mtime
对其进行排序。
find
按照底层文件系统实现报告的顺序列出对象。您可以告诉 ls
向您显示此 "raw" 订单,方法是将其传递给 -f
选项。
顺序可以是任何顺序——按字母顺序、mtime
、atime
、名称长度、权限或完全不同的顺序。顺序甚至可以从一个列表到下一个不同。
文件系统通常以反映文件系统为文件分配目录槽的策略的顺序进行报告。如果这是某种基于文件名的基于散列的策略,那么顺序可能显得毫无意义。这就是广泛使用的 Linux 和 BSD 文件系统实现所发生的情况。既然你提到了 extfs 这可能就是导致你看到的顺序的原因。
因此,如果您需要以特定方式对 find
的输出进行排序,则您必须自己创建该顺序。也许基于类似的东西:
find . -type f -exec ls -ltr --time-style=+%s {} \; | sort -n -k6