Як заявив @samiam , список повертається вам у напіввипадковому порядку через readdir()
. Я просто додам наступне.
Повертається список - це те, що я б назвав порядком у каталозі. У старих файлових системах часто є порядок створення, який були додані записи файлів у таблицю каталогу. Звичайно, є застереження до цього: коли запис каталогу видалено, цей запис потім рециркулюється, тому будь-які наступні файли, які зберігаються, замінять попередній запис, тому замовлення більше не ґрунтується виключно на часі створення.
У сучасних файлових системах, де структури даних каталогів базуються на дереві пошуку або хеш-таблиці, порядок є практично непередбачуваним.
Приклади
Клацання файлів, створених під час запуску сенсорної команди, виявляє наступні вставки.
$ touch dir/{{1..8},{a..p}}
$ stat --printf="%n -- %i\n" dir/*
dir/1 -- 10883235
dir/2 -- 10883236
dir/3 -- 10883242
dir/4 -- 10883243
dir/5 -- 10883244
dir/6 -- 10883245
dir/7 -- 10883246
dir/8 -- 10883247
dir/a -- 10883248
dir/b -- 10883249
dir/c -- 10883250
dir/d -- 10883251
dir/e -- 10883252
dir/f -- 10883253
dir/g -- 10883254
dir/h -- 10883255
dir/i -- 10883256
dir/j -- 10883299
dir/k -- 10883302
dir/l -- 10883303
dir/m -- 10883311
dir/n -- 10883424
dir/o -- 10883426
dir/p -- 10883427
Таким чином, ми можемо бачити, що розширення дужок, яке використовується дотиком, створює назви файлів в алфавітному порядку, і тому їм присвоюється послідовний номер вводу при записі на жорсткий диск. (Однак це не впливає на порядок у каталозі.)
Виконання вашої tar
команди кілька разів, здавалося б, вказує на те, що в списку є замовлення, оскільки його виконання кілька разів дає кожен і той самий список. Тут я запустив його 100 разів, а потім порівняв пробіжки, і всі вони однакові.
$ for i in {1..100};do tar cJvf file.tar.xz dir/ > run${i};done
$ for i in {1..100};do cmp run1 run${i};done
$
Якщо ми стратегічно видалимо скажімо, dir/e
а потім додамо новий файл, dir/ee
ми можемо побачити, що цей новий файл зайняв місце, яке dir/e
займало раніше, в таблиці записів каталогів.
$ rm dir/e
$ touch dir/ee
Тепер збережемо висновок з однієї for
петлі вгорі, просто 1-ї.
$ mv run1 r1A
Тепер, якщо ми повторно запустимо for
цикл, який запустить tar
команду ще 100 разів, і порівняємо цей другий запуск з попереднім:
$ sdiff r1A run1
dir/ dir/
...
dir/c dir/c
dir/f dir/f
dir/e | dir/ee
dir/o dir/o
dir/2 dir/2
...
Ми помічаємо, що dir/ee
займає dir/e
місце в таблиці каталогів.
stat --printf='%i\t-- %n\n' * | sort -n | sed 's/.*\t-- //'