ในฐานะที่เป็น@samiamreaddir()
ได้ระบุไว้ในรายการจะถูกส่งกลับให้กับคุณในการสั่งซื้อกึ่งสุ่มผ่าน ฉันจะเพิ่มต่อไปนี้
รายการที่ส่งคืนคือสิ่งที่ฉันจะเรียกลำดับไดเรกทอรี บนระบบไฟล์ที่เก่ากว่าลำดับมักจะเป็นลำดับการสร้างที่เพิ่มรายการไฟล์ในตารางของไดเรกทอรี แน่นอนมีข้อแม้นี้เมื่อลบรายการไดเรกทอรีรายการนี้จะถูกรีไซเคิลแล้วดังนั้นไฟล์ใด ๆ ที่ตามมาที่เก็บไว้จะแทนที่รายการก่อนหน้าดังนั้นคำสั่งจะไม่ขึ้นอยู่กับเวลาในการสร้างเพียงอย่างเดียว
บนระบบไฟล์ที่ทันสมัยซึ่งโครงสร้างข้อมูลไดเรกทอรีขึ้นอยู่กับโครงสร้างการค้นหาหรือตารางแฮชลำดับที่ไม่สามารถคาดเดาได้จริง
ตัวอย่าง
poking ที่ไฟล์ที่สร้างขึ้นเมื่อคุณเรียกใช้คำสั่ง touch ของคุณเผยให้เห็น inodes ต่อไปนี้ได้รับมอบหมาย
$ 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
ดังนั้นเราจะเห็นได้ว่าการขยายตัวรั้งที่ใช้โดยการสัมผัสสร้างชื่อไฟล์ตามลำดับตัวอักษรดังนั้นพวกเขาจึงได้รับหมายเลขไอโหนดเรียงตามลำดับเมื่อเขียนไปยัง HDD (อย่างไรก็ตามจะไม่มีผลกับลำดับในไดเรกทอรี)
การรัน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-- //'