为什么这个 find -newermt 命令的输出显然不按顺序?

为什么这个 find -newermt 命令的输出显然不按顺序?

当我跑步时

touch a.txt && sleep 0.1 && \
touch b.txt && sleep 0.1 && \
touch c.txt && sleep 0.1 && \
touch d.txt && sleep 0.1 && \
touch e.txt && sleep 0.1 && \
touch f.txt && sleep 0.1 && \
find -newermt "1 sec ago"

该列表似乎没有按顺序排列。

$ touch a.txt && sleep 0.1 && \
> touch b.txt && sleep 0.1 && \
> touch c.txt && sleep 0.1 && \
> touch d.txt && sleep 0.1 && \
> touch e.txt && sleep 0.1 && \
> touch f.txt && sleep 0.1 && \
> find -newermt "1 sec ago"
./d.txt
./f.txt
./a.txt
./c.txt
./b.txt
./e.txt
$ 

顺序是可重现的。但为什么顺序是这样的?我知道我可以对输出进行排序,但默认输出的顺序似乎很奇怪。

-printf '%T@ %p\n'顺便说一下,如果使用,则会生成相同的顺序:

$ touch a.txt && sleep 0.1 && \
> touch b.txt && sleep 0.1 && \
> touch c.txt && sleep 0.1 && \
> touch d.txt && sleep 0.1 && \
> touch e.txt && sleep 0.1 && \
> touch f.txt && sleep 0.1 && \
> find -newermt "1 sec ago" -type f -printf '%T@ %p\n'
1567346420.7185077410 ./d.txt
1567346420.9305093600 ./f.txt
1567346420.3905052190 ./a.txt
1567346420.6065068740 ./c.txt
1567346420.5025060780 ./b.txt
1567346420.8225085330 ./e.txt
$ 

$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  3.9G     0  3.9G   0% /dev
tmpfs          tmpfs     785M  1.7M  784M   1% /run
/dev/sda6      ext4      288G   99G  175G  37% /
tmpfs          tmpfs     3.9G   39M  3.8G   1% /dev/shm
tmpfs          tmpfs     5.0M  4.0K  5.0M   1% /run/lock
tmpfs          tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1      vfat      496M   39M  458M   8% /boot/efi
tmpfs          tmpfs     785M     0  785M   0% /run/user/118
tmpfs          tmpfs     785M   28K  785M   1% /run/user/1000
$ 

文件系统是默认的,ext4


运行这些命令的 shell 是bash

$ bash --version
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)

答案1

这里有两个重要的概念:-newerXY只影响对哪些文件进行操作,而不影响操作的顺序,顺序find发现兄弟姐妹未指定,实际上取决于文件系统驱动程序的实现细节。

-newerXY过滤但不排序。

谓词-newermt测试文件的修改时间是否晚于您指定为其操作数的时间(1 sec ago在本例中),并过滤掉较旧的文件。它不会影响find发现文件的顺序,也不会影响执行操作的顺序(包括-print未提供其他操作时的默认操作),该顺序与发现文件的顺序相同。由于find按文件发现的顺序对文件执行操作并且不对其输出进行排序,因此newermt不会导致文件按其修改时间排序。

这一切同样适用于其他形式的-newerXY

可以按任何顺序发现同一目录中的文件。

至于发现的顺序,steeldriver 说,没有保证的顺序对于直接位于同一目录中的文件。在类似情况下,您有时可能会看到按相同顺序排列的文件,有时则不会,并且我们不对顺序做出任何保证。

find以递归方式操作,从每个起始点遍历整个目录层次结构。(Ubuntu 使用 GNU find,它将没有指定起始点的情况(如您的示例)视为从 开始.。)具体来说,它对一个或多个目录树执行深度优先前序遍历。可以使用和谓词限制它在树中的位置-maxdepth-prune以及通过各种方式(包括 )阻止它根据文件在树中的位置选择文件-mindepth,但除此之外,它会在其起始点下查找所有位置。

对其发现文件的顺序有一些限制。它不能在不同目录中的文件之间来回跳转。如果你将它a作为起点,它可能会发现a/x/1在 之前或之后a/x/2。如果它找到a/y,它可能出现在 和 之前或之后a/x/ya/x/2这就是说,位于同一目录中的条目可以按任何顺序处理。但a/y不会出现之间 a/x/1a/x/2

相关内容