استخدام اهتمام من القطران ... ولكن ماذا يحدث؟

StackOverflow https://stackoverflow.com/questions/316078

  •  11-07-2019
  •  | 
  •  

سؤال

ورأيت الاستخدام للاهتمام التالية من القطران في البرامج النصية باش زميل في العمل و:

`tar cf - * | (cd <dest> ; tar xf - )`

وعلى ما يبدو أنه يعمل مثل الكثير من رسينك -av لا، ولكن بشكل أسرع. السؤال الذي يطرح نفسه، كيف؟

و-m


تعديل : لهل يستطيع أحد أن يفسر <م> لماذا يجب أن يكون هذا الحل الأفضل على ما يلي؟

cp -rfp * dest

وأسرع من السابق؟

هل كانت مفيدة؟

المحلول

في الفرق بين حزب المحافظين والقطران لنسخ التسلسلات الهرمية الدليل، ويمكن إجراء تجربة بسيطة لإظهار الفرق:

alastair box:~/hack/cptest [1134]% mkdir src
alastair box:~/hack/cptest [1135]% cd src
alastair box:~/hack/cptest/src [1136]% touch foo
alastair box:~/hack/cptest/src [1137]% ln -s foo foo-s
alastair box:~/hack/cptest/src [1138]% ln foo foo-h
alastair box:~/hack/cptest/src [1139]% ls -a
total 0
-rw-r--r--  2 alastair alastair    0 Nov 25 14:59 foo
-rw-r--r--  2 alastair alastair    0 Nov 25 14:59 foo-h
lrwxrwxrwx  1 alastair alastair    3 Nov 25 14:59 foo-s -> foo
alastair box:~/hack/cptest/src [1142]% mkdir ../cpdest
alastair box:~/hack/cptest/src [1143]% cp -rfp * ../cpdest
alastair box:~/hack/cptest/src [1144]% mkdir ../tardest
alastair box:~/hack/cptest/src [1145]% tar cf - * | (cd ../tardest ; tar xf - )
alastair box:~/hack/cptest/src [1146]% cd ..
alastair box:~/hack/cptest [1147]% ls -l cpdest
total 0
-rw-r--r--  1 alastair alastair    0 Nov 25 14:59 foo
-rw-r--r--  1 alastair alastair    0 Nov 25 14:59 foo-h
lrwxrwxrwx  1 alastair alastair    3 Nov 25 15:00 foo-s -> foo
alastair box:~/hack/cptest [1148]% ls -l tardest
total 0
-rw-r--r--  2 alastair alastair    0 Nov 25 14:59 foo
-rw-r--r--  2 alastair alastair    0 Nov 25 14:59 foo-h
lrwxrwxrwx  1 alastair alastair    3 Nov 25 15:00 foo-s -> foo

والفرق هو في ملفات القرص الثابت مرتبطة. لاحظ كيف يتم نسخ الملفات الصعبة المرتبطة بشكل فردي مع cp وجنبا إلى جنب مع tar. لجعل الفرق أكثر وضوحا، لديها نظرة على inodes لكل:

alastair box:~/hack/cptest [1149]% ls -i cpdest
24690722 foo  24690723 foo-h  24690724 foo-s
alastair box:~/hack/cptest [1150]% ls -i tardest
24690801 foo  24690801 foo-h  24690802 foo-s

وهناك أسباب أخرى ربما يفضلون القطران، ولكن هذا هو واحد كبير واحد، على الأقل إذا كان لديك ملفات على نطاق واسع مرتبط بشدة.

نصائح أخرى

وويكتب الأرشيف إلى الإخراج القياسي، ثم الأنابيب هو إلى فرعي أو جانبي - ملفوفة بواسطة الأقواس - أن التغييرات في دليل مختلف ويقرأ / مقتطفات من الإدخال القياسي. وهذا ما يعني الطابع شرطة بعد حجة f. انها في الأساس نسخ كافة الملفات والدلائل واضحة على الدليل الحالي إلى دليل آخر.

للدليل مع 25000 ملفات فارغة:

$ time { tar -cf - * | (cd ../bar; tar -xf - ); }
real    0m4.209s
user    0m0.724s
sys 0m3.380s

$ time { cp * ../baz/; }
real    0m18.727s
user    0m0.644s
sys 0m7.127s

للدليل مع 4 ملفات 1073741824 بايت (1GB) كل

$ time { tar -cf - * | (cd ../bar; tar -xf - ); }
real    3m44.007s
user    0m3.390s
sys 0m25.644s

$ time { cp * ../baz/; }
real    3m11.197s
user    0m0.023s
sys 0m9.576s

وتخميني هو هذه الظاهرة هي غاية تعتمد على نظام الملفات. إذا أنا الحق سترى الفرق الجذري بين الملفات التي تتخصص في العديد من الملفات الصغيرة، مثل استعادة ReiserFS 3.6، والملفات التي هي أفضل في التعامل مع الملفات الكبيرة.

و(جريت الاختبارات المذكورة أعلاه على HFS +).

وهذا هو استخدام فريدة من الأنابيب. في الأساس، والقطران الأول عادة ما يكتب مباشرة إلى ملف، ولكن بدلا من ذلك انها سوف أكتب المعياري (و-)، والذي ثم إعادة توجيهها إلى القطران الآخر الذي يأخذ ستدين بدلا من ملف. أساسا هذا هو الشيء نفسه tarring إلى ملف وuntarring في وقت لاحق، باستثناء بدون ملف بينهما.

والكتاب بوويرتولس لديه نسخة على النحو التالي:

وtar cf - * | (cd <dest> && tar xvBf - )

وو"&& هو شرط أن يتحقق رمز الإرجاع من الأمر السابق. Ihat غير، وإذا كانت "سي دي" فشل، و "XF القطران -" لن يتم تنفيذها. أنا دائما رمي في -v (مطول) و-B (reblock المدخلات).

ويمكنني استخدام القطران في كل وقت. انها مفيدة بشكل خاص للنسخ إلى نظام بعيد، مثل:

والقطران CVF -. | سه شخص @ somemachine "(مؤتمر نزع السلاح في مكان ما && القطران xBf -) '

tar cf - * | (cd <dest> ; tar xf - )

وسوف القطران جميع لا يخفى الملفات / الدلائل من الدليل الحالي إلى المعياري، ثم الأنابيب التي ستدين إلى لsubshells الجديدة ". أن قذيفة أولا بتغيير دليل العمل الحالي إلى <dest>، ثم untars لهذا الدليل.

وبعض الإصدارات القديمة من حزب المحافظين لم يكن لديهم -f / -p (وما شابهها) خيارات للحصول على أذونات الحفاظ، وحتى هذه خدعة القطران لم المهمة.

وأعتقد أن القطران سوف يقوم أسلوب ويندوز 'دمج' بالتعاون مع الدلائل متداخلة بعمق، في حين أن حزب المحافظين سوف الكتابة الدلائل الفرعية.

وعلى سبيل المثال إذا كان لديك تخطيط:

dir/subdir/file1

ويمكنك نسخه إلى الوجهة التي تحتوي على:

dir/subdir/file2

وبعد ذلك مع نسخة سيترك لك:

dir/subdir/file1

ولكن مع الأمر القطران، سيحتوي جهتك:

dir/subdir/file1
dir/subdir/file2
tar cf - *

وهذا يستخدم القطران لارسال * إلى المعياري

|

وهذا لا إعادة توجيه واضح من المعياري ل...

(cd <dest> ; tar xf - )

وهذا، والذي يتغير الأشخاص ذوي الإعاقة إلى الموقع المناسب ومن ثم مقتطفات من ستدين

وأنا لا أعرف لماذا هذا سيكون أسرع من رسينك، حيث لا يوجد ضغط المعنية.

والحل القطران والحفاظ على روابط رمزية، في حين أن حزب المحافظين سوف تجعل مجرد نسخ وتدمير الروابط.

تم القطران أداة يونكس القياسية وقتا أطول من رسينك. أنت أكثر احتمالا للعثور عليه في حالة عندما يحتاج إلى التسلسل الهرمي الدليل ليتم نسخها إلى موقع آخر (حتى جهاز كمبيوتر آخر). رسينك هو على الأرجح أسهل استخداما هذه الأيام، ولكن أبطأ لأنه يقارن كل من المصدر والوجهات والمزامنة للهم. القطران نسخ فقط في اتجاه واحد.

إذا كان لديك GNU cp (التي جميع أنظمة لينكس على أساس و)، وcp --archive ستعمل، وحتى على الملفات الصعبة المرتبطة، وليس هناك حاجة القطران.

وكما يحدث، وكتب زميل في العمل أمر متطابقة تقريبا في واحدة من مخطوطات لدينا. بعد أن أمضى بعض الوقت المحير أكثر من ذلك، وسألت لماذا كان يستخدم أنه بدلا من cp. جوابه، على ما أذكر ذلك، كان هذا cp بطيء عند تقديم نسخة من نظام ملف واحد إلى آخر.

وأم لا هذا غير صحيح يتطلب المزيد من الاختبارات من يهمني أن تنفق على هذا السؤال، ولكنه يجعل كمية معينة من معنى. يقرأ عملية tar الأولى من الجهاز مصدر في أسرع وقت ممكن ننتظر فقط لهذا الجهاز للقراءة. وفي الوقت نفسه، يقرأ عملية tar الثانية من الأنابيب مدخلاته ويكتب في أسرع وقت ممكن. انها قد تضطر الى الانتظار لإدخال، ولكن إذا يكتب على الجهاز الوجهة تكون أبطأ من يقرأ على الجهاز المصدر انه سينتظر فقط على الجهاز الوجهة. وأمر cp واحد يجب أن تنتظر على كل من المصدر وأجهزة الوجهة.

وعلى صعيد آخر، نظم التشغيل الحديثة القيام بعمل جيد جدا من عمليات IO التخزين المؤقت مسبقا. انها سوف الممكن تماما cp يقضي معظم وقته في انتظار يكتب والحصول يقرأ من الذاكرة بدلا من الجهاز نفسه. ويبدو وكأنه واحد في حاجة بيانات قوية حقا لاختيار باستخدام اثنين من الأوامر tar بدلا من الأمر cp أكثر وضوحا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top