Когда я запускаю
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)
Здесь существует два важных понятия: -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
.