Почему вывод этой команды 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 .


Оболочка, из которой были запущены эти команды: bash:

$ bash --version
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
4
задан 1 September 2019 в 17:56

1 ответ

Здесь существует два важных понятия: -newerXY только влияние, на каких файлах управляют а не порядок, в котором на них управляют, порядок find обнаруживает, что одноуровневые элементы являются неуказанными и на практике зависят от деталей реализации драйвера файловой системы.

-newerXY фильтры, но это не сортирует.

-newermt предикат тестирует, если файлы были изменены позже, чем время, Вы указываете как его операнд (1 sec ago в этом случае), отфильтровывая тех, которые являются более старыми. Это не влияет на порядок в который find обнаруживает файлы, и при этом это не влияет на порядок в который действия (включая значение по умолчанию -print действие, когда никакое другое действие не предоставляется) выполняются, который совпадает с порядком, в котором обнаружены файлы. С тех пор find выполняет действия с файлами в порядке, они обнаружены, и не сортирует его вывод, newermt не заставляет файлы быть отсортированными к их времени изменения.

Все это применяется одинаково к другим формам -newerXY.

Файлы в том же каталоге могут быть обнаружены в любом порядке.

Что касается того, каков порядок исследования, поскольку говорит steeldriver, нет никакого гарантируемого порядка на это для файлов, находящихся непосредственно в том же каталоге. Можно иногда видеть файлы в том же порядке в аналогичных ситуациях и иногда не, и нет никакого обещания, сделанного о порядке.

find работает рекурсивно, обходя всю иерархию каталогов от каждой из ее начальных точек. (Использование Ubuntu GNU находит который обработки отсутствие указанной начальной точки, как в Вашем примере, как то, чтобы означать начать с ..) А именно, это выполняет обход перед порядком в глубину одного или нескольких деревьев каталогов. Возможно ограничить, куда в дереве это идет с -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.

3
ответ дан 1 December 2019 в 09:59

Другие вопросы по тегам:

Похожие вопросы: