当我跑
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)
这里有两个重要的概念:
-newerXY
只影响对哪些文件进行操作,而不影响对它们进行操作的顺序,find
发现兄弟姐妹的顺序是未指定的,实际上取决于文件系统驱动程序的实现细节。-newerXY
过滤器,但它不排序。谓词测试文件的
-newermt
修改时间是否比您指定为其操作数的时间(1 sec ago
在本例中)更晚,过滤掉那些较旧的文件。它不影响find
发现文件的顺序,也不影响执行动作的顺序(包括-print
不提供其他动作时的默认动作),与发现文件的顺序相同。由于find
按照文件被发现的顺序对文件执行操作并且不会对其输出newermt
进行排序,因此不会导致文件按其修改时间排序。所有这些同样适用于其他形式的
-newerXY
.可以以任何顺序发现同一目录中的文件。
至于发现的顺序是什么,正如steeldriver 所说,对于直接位于同一目录中的文件,没有保证的顺序。您有时可能会在类似情况下看到相同顺序的文件,有时则不会,并且没有关于该顺序的承诺。
find
递归操作,从每个起点遍历整个目录层次结构。(Ubuntu 使用 GNU find 将缺少指定起点(如您的示例)视为从 . 开始的含义.
。)具体来说,它执行一个或多个目录树的深度优先前序遍历。可以限制它在树中的位置与-maxdepth
和-prune
谓词,以及防止它以各种方式(包括-mindepth
)根据它们在树中的位置来选择文件,但除此之外它在其起点下到处寻找。这确实意味着对它发现文件的顺序有一些限制。它不能在不同目录中的文件之间来回跳转。如果你把它
a
作为一个起点,它可能会发现a/x/1
before 或 aftera/x/2
。如果找到,它可能出现在anda/y
之前或之后。这就是说,可以以任何顺序处理直接位于同一目录中的条目。但不会出现在and之间。a/x/y
a/x/2
a/y
a/x/1
a/x/2