В каком порядке находится (1) список файлов? - PullRequest
0 голосов
/ 02 июня 2018

В extfs, если в каталоге есть только создания файлов и не-удаления, я ожидаю, что find . -type f отобразит файлы либо в хронологическом порядке их создания (или mtime), либо, если нет, впо крайней мере, в обратном хронологическом порядке ... в зависимости от того, как просматривается содержимое каталога.

Но это не то поведение, которое я вижу.

Следующий код, например, создает новый набор каталогов и файлов:

#!/bin/bash -u

for i in a/ a/{1,2,3,4,5} b/ b/{1,2,3,4,5}; do
    if echo "$i" | egrep -q "/$"; then
        echo "Creating dir $i"
        mkdir -p "$i"
    else
        echo "Creating file $i"
        touch "$i"
    fi
    sleep 0.500
done

Вывод приведенного выше фрагмента:

Creating dir a/
Creating file a/1
Creating file a/2
Creating file a/3
Creating file a/4
Creating file a/5
Creating dir b/
Creating file b/1
Creating file b/2
Creating file b/3
Creating file b/4
Creating file b/5

Однако findперечисляет файлы в несколько случайном порядке.Например, a/2 не следует a/1, а b/2 не следует b/1:

$ find . -type f
./a/1
./a/3
./a/4
./a/2   <----
./a/5
./b/1
./b/3
./b/4
./b/2   <----
./b/5

Есть идеи, почему это должно происходить?

Моя основная проблема: У меня очень большой том, в котором хранятся сотни тысяч файлов.Мне нужно просмотреть эти файлы и каталоги в порядке их создания / изменения (mtime) и передать каждый файл другому процессу для дальнейшей обработки.Но я не обязательно хочу сначала создать временный список из этого большого набора файлов, а затем отсортировать его на основе mtime, прежде чем отправлять его в мой процесс.

1 Ответ

0 голосов
/ 03 июня 2018

find перечисляет объекты в том порядке, в котором они представлены базовой реализацией файловой системы.Вы можете указать ls показать вам этот «необработанный» заказ, передав ему параметр -f.

Порядок может быть любым - в алфавитном порядке, на mtime, на atime,по длине имени, по разрешениям или что-то совершенно другое.Порядок может даже варьироваться от одного списка к следующему.

Обычно файловые системы представляют отчеты в порядке, отражающем стратегию файловой системы для выделения слотов каталогов для файлов.Если это какая-то стратегия, основанная на хэше, основанная на имени файла, то порядок может показаться бессмысленным.Это то, что происходит с широко используемыми реализациями файловых систем Linux и BSD.Поскольку вы упоминаете extfs , это, вероятно, и является причиной того, что вы видите порядок.

Итак, если вам нужно, чтобы выходные данные из find были упорядочены определенным образом, выдолжен создать этот заказ самостоятельно.Может быть, что-то вроде:

  find . -type f -exec ls -ltr --time-style=+%s {} \; | sort -n -k6
...