当我跑步时
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/y
。a/x/2
这就是说,位于同一目录中的条目可以按任何顺序处理。但a/y
不会出现之间 a/x/1
和a/x/2
。