ফাইলগুলিতে ট্যারে কাজ করার আদেশটি কীভাবে নির্ধারিত হয়?


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

আমি এটি বর্ণানুক্রমিক হতে হবে আশা করি। তবে দৃশ্যত তা নয় not এখানে সূত্র কী?

উত্তর:


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উপরের লুপটির উপর থেকে আউটপুটটি রাখা যাক , প্রথম ১ মটি।

$ 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
আমি মনে করি এটি ফাইল সিস্টেম নির্ভর। আমি একটি বিটি্রি-টাইপ ফাইল সিস্টেমটি ফাইল হ্যাশের ক্রমের ভিত্তিতে বা এ জাতীয় কিছুতে বাছাই করার কল্পনা করতে পারি (আমি বুঝতে পারি যে পুরানো
রিসারফএস

1
@ সিয়ামিয়াম - ঠিক আছে, এই উত্তরে দাবি করা হয় যে 'ডিরেক্টরি আদেশ' ডিরেক্টরিটির নির্দেশিকায় রয়েছে যে ডিরেক্টরিটির টেবিলের মধ্যে ফাইল এন্ট্রি যুক্ত করা হয়েছিল 'এবং তারপরে এটি নিজেই টার ফাইলের সামগ্রীর টুকরো দেখায় যে এটি সত্য নয়। বর্তমান লিনাক্সের এক্সট * ফাইল সিস্টেমগুলি সহ অনেকগুলি ফাইল সিস্টেম তাদের ডিরেক্টরি কাঠামোতে গাছ এবং / অথবা হ্যাশগুলি ব্যবহার করে, কিছু পুরানো ফাইল সিস্টেমের মতো সাধারণ ক্রমিক টেবিল নয়।
মিশা পলিটোভস্কি

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এর fs বাস্তবায়ন রিটার্নগুলিকে পুনর্বিন্যাস করে ।
ম্যাট

@ এসএলএম না, আমি কখনই এমন কোনও ফাইল সিস্টেমের কথা শুনিনি যেখানে ইনোডের মানটি ডিরেক্টরি আদেশে প্রভাব ফেলবে।
গিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.