Như @samiam đã tuyên bố danh sách được trả lại cho bạn theo thứ tự bán ngẫu nhiên thông qua readdir()
. Tôi sẽ chỉ thêm vào như sau.
Danh sách trả về là những gì tôi sẽ gọi thứ tự thư mục. Trên các hệ thống tệp cũ hơn, thứ tự thường là thứ tự tạo mà các mục nhập tệp trong bảng của thư mục đã được thêm vào. Tất nhiên có một sự cảnh báo cho điều này, khi một mục nhập thư mục bị xóa, mục nhập này sau đó được tái chế, do đó, bất kỳ tệp nào được lưu trữ sẽ thay thế mục nhập trước đó, vì vậy đơn hàng sẽ không còn chỉ dựa vào thời gian tạo.
Trên các hệ thống tệp hiện đại nơi cấu trúc dữ liệu thư mục dựa trên cây tìm kiếm hoặc bảng băm, thứ tự thực tế không thể đoán trước.
Ví dụ
Chọc vào các tệp được tạo khi bạn chạy lệnh cảm ứng cho thấy các nút sau được chỉ định.
$ 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
Vì vậy, chúng ta có thể thấy rằng việc mở rộng dấu ngoặc được sử dụng bởi cảm ứng tạo ra tên tệp theo thứ tự bảng chữ cái và do đó chúng được gán các số inode liên tiếp khi được ghi vào ổ cứng. (Tuy nhiên, điều đó không ảnh hưởng đến thứ tự trong thư mục.)
Chạy tar
lệnh của bạn nhiều lần dường như cho thấy rằng có một thứ tự cho danh sách, vì chạy nó nhiều lần sẽ mang lại cùng một danh sách mỗi lần. Ở đây tôi đã chạy nó 100 lần và sau đó so sánh các lần chạy và chúng đều giống hệt nhau.
$ 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
$
Nếu chúng ta xóa chiến lược nói dir/e
và sau đó thêm một tệp mới, dir/ee
chúng ta có thể thấy rằng tệp mới này đã chiếm vị trí dir/e
chiếm chỗ trước trong bảng mục nhập thư mục.
$ rm dir/e
$ touch dir/ee
Bây giờ, hãy giữ đầu ra từ một trong các for
vòng lặp ở trên, chỉ là vòng đầu tiên.
$ mv run1 r1A
Bây giờ nếu chúng ta chạy lại for
vòng lặp sẽ chạy lại tar
lệnh 100 lần và so sánh lần chạy thứ hai này với vòng lặp trước:
$ 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
...
Chúng tôi nhận thấy rằng dir/ee
đã thực hiệndir/e
vị trí trong bảng thư mục.
stat --printf='%i\t-- %n\n' * | sort -n | sed 's/.*\t-- //'