वह क्रम किस प्रकार है जिसमें टार निर्धारित फाइलों पर काम करता है?


15
$ touch dir/{{1..8},{a..p}}
$ tar cJvf file.tar.xz dir/
dir/
dir/o
dir/k
dir/b
dir/3
dir/1
dir/i
dir/7
dir/4
dir/e
dir/a
dir/g
dir/2
dir/d
dir/5
dir/8
dir/c
dir/n
dir/f
dir/h
dir/6
dir/l
dir/m
dir/j
dir/p

मुझे उम्मीद थी कि यह वर्णमाला होगी। लेकिन स्पष्ट रूप से यह नहीं है। क्या सूत्र है, यहाँ?

जवाबों:


14

जैसा कि @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-- //'
जॉन

2
मुझे लगता है कि यह फाइलसिस्टम पर निर्भर है। मैं फ़ाइल हैश के आदेश के आधार पर उन्हें सॉर्ट करने वाले एक btree-प्रकार की फाइलसिस्टम की कल्पना कर सकता हूं या कुछ इस तरह (मेरे पास एक समझ है पुराने ReiserFS उन्हें अलग तरह से आदेश देते हैं, क्योंकि फाइलसिस्टम गतिशील रूप से
इनोड

1
@samiam - सही है, यह उत्तर दावा करता है कि 'डायरेक्टरी ऑर्डर' 'क्रिएशन ऑर्डर' है जो डायरेक्टरी की टेबल में फाइल एंट्रीज़ को जोड़ा गया था 'और फिर वह खुद ही टार फाइल कंटेंट के टुकड़े दिखाते हुए दिखाती है कि यह सच नहीं है। कई फाइल सिस्टम, जिसमें वर्तमान लिनक्स ext * फाइल सिस्टम शामिल हैं, अपनी निर्देशिका संरचनाओं में पेड़ों और / या हैश का उपयोग करते हैं, न कि कुछ पुराने फाइल सिस्टम की तरह सरल अनुक्रमिक तालिकाओं का।
माइकल पॉलिटोस्की

3
@ जॉन ls -fया ls -Uयाfind -maxdepth 1

1
@ जॉन -fध्वज प्राचीन यूनिक्स से आता है। इसका उद्देश्य तेज होना था। यह सॉर्टिंग, डॉटफ़ाइल्स की स्किपिंग और कुछ अन्य चीजों को अक्षम करता है। -Uझंडा एक जीएनयू नवीनता है जो किसी भी अन्य दुष्प्रभाव के बिना अक्षम छंटाई करने की अनुमति देता है।

8

readdir()मूल रूप से। जब टार को पता चलता है कि एक डायरेक्टरी में कौन सी फाइलें हैं, तो यह सीधे कर्नेल से opendir()उसके बाद फाइल लिस्टिंग के लिए पूछता है readdir()readdir()किसी विशेष क्रम में फ़ाइलों को वापस नहीं करता है; जिस तरह से फाइल का ऑर्डर दिया जाता है वह लिनक्स कर्नेल द्वारा उपयोग की जा रही फाइल सिस्टम पर निर्भर करता है।

वहाँ, अफसोस, tarउपनिर्देशिकाओं में फ़ाइलों को क्रमबद्ध करने के लिए एक विकल्प नहीं है (एक पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है)।


1
मैं सोच रहा था कि क्या यह उनके इनोड मूल्य के आधार पर उन्हें पुनः प्राप्त करता है?
slm

1
@ एसएलएम वह f_op->iterateकॉल जो ग्लिबक readdir()अंततः के माध्यम से फ़िल्टर getdents()करता है उसे एक फाइल सिस्टम विशिष्ट कार्यान्वयन में मैप किया जाता है। मैं उच्च स्तर पर कुछ भी नहीं देख सकता है direntजो एफएस के कार्यान्वयन रिटर्न को फिर से व्यवस्थित करता है।
मैट

@ एसएलएम नहीं, मैंने कभी भी एक फाइलसिस्टम के बारे में नहीं सुना है जहां इनोड वैल्यू का डायरेक्टरी ऑर्डर पर प्रभाव होगा।
गाइल्स का SO- बुराई से रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.