在find . -type f
上,如果目录中只有文件创建而没有-deletions,我希望extfs会按照文件创建的时间顺序(或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
你知道为什么会发生这种情况吗?
我的主要问题是:,,我有一个非常大的卷,存储了上百个,上千个文件。我需要按照创建/修改(mtime
)的顺序遍历这些文件和目录,并通过管道将每个文件传递给另一个进程进行进一步处理。但我不一定要先创建这一大组文件的临时列表,然后根据mtime
对其进行排序,然后再通过管道将其传送到我的进程。
发布于 2018-06-03 09:09:19
find
按照底层文件系统实现报告对象的顺序列出对象。您可以通过向ls
传递-f
选项来告诉它显示这个“原始”订单。
这个顺序可以是任何东西--按字母顺序、按mtime
、按atime
、按名称长度、按权限或其他完全不同的顺序。排序甚至可以根据列表的不同而有所不同。
文件系统通常以反映文件系统为文件分配目录槽的策略的顺序进行报告。如果这是某种基于文件名的基于散列的策略,那么这种顺序可能看起来毫无意义。这就是广泛使用的Linux和BSD文件系统实现所发生的情况。由于您提到了extfs,这可能就是导致您看到的排序的原因。
因此,如果您需要以特定的方式对find
的输出进行排序,那么您必须自己创建该顺序。也许是基于这样的东西:
find . -type f -exec ls -ltr --time-style=+%s {} \; | sort -n -k6
https://stackoverflow.com/questions/50654159
复制相似问题