سؤال

على UNIX باش قذيفة (على وجه التحديد نظام التشغيل Mac OS X ليوبارد) ما يمكن أن يكون أبسط طريقة نسخ كل الملفات ذات امتداد من التسلسل الهرمي للمجلد (بما في ذلك المجلدات الفرعية) إلى نفس المجلد الوجهة (بدون المجلدات الفرعية)?

من الواضح أن هناك مشكلة وجود تكرارات في المصدر الهرمي.أنا لا أمانع إذا كانت الكتابة.

على سبيل المثال:أنا بحاجة إلى نسخ كل .ملف txt في التسلسل التالي

/foo/a.txt
/foo/x.jpg
/foo/bar/a.txt
/foo/bar/c.jpg
/foo/bar/b.txt

إلى مجلد اسمه 'ال' والحصول على:

/dest/a.txt
/dest/b.txt
هل كانت مفيدة؟

المحلول

في bash:

find /foo -iname '*.txt' -exec cp \{\} /dest/ \;

find سوف تجد كل الملفات تحت المسار /foo مطابقة البدل *.txt, القضية insensitively (هذا ما -iname يعني).لكل ملف ، find سيتم تنفيذ cp {} /dest/, مع العثور على الملف في مكان {}.

نصائح أخرى

المشكلة الوحيدة مع ماغنوس الحل هو أنه شوك جديد "cp" العملية لكل ملف ، والتي ليست بشكل رهيب كفاءة خاصة إذا كان هناك عدد كبير من الملفات.

على لينكس (أو غيرها من أنظمة جنو coreutils) يمكنك القيام به:

find . -name "*.xml" -print0 | xargs -0 echo cp -t a

(إن -0 يسمح لها بالعمل عند أسماء قد أحرف غريبة-مثل المساحات -- في نفوسهم.)

للأسف أعتقد أجهزة ماكينتوش تأتي مع BSD على غرار الأدوات.أحد يعرف "المعيار" أي ما يعادل "-t" التبديل ؟

الإجابات أعلاه لا تسمح تضارب الاسم لأن السائل لم تمانع الملفات التي يتم أكثر من الخطية.

هل الملفات التي يتم على كتابتها حتى جاء مع نهج مختلف.استبدال كل / في المسار مع الحفاظ على التسلسل الهرمي في الأسماء ، ويضع كل الملفات في شقة واحدة مجلد.

نحن نستخدم تجد للحصول على قائمة من كافة الملفات ، ثم awk لإنشاء الأمر mv مع اسم الملف الأصلي و المعدل اسم الملف ثم تمرير تلك باش ليتم تنفيذها.

find ./from -type f | awk '{ str=$0; sub(/\.\//, "", str); gsub(/\//, "-", str); print "mv " $0 " ./to/" str }' | bash

حيث ./من و ./هي الدلائل إلى mv من و إلى.

إذا كنت حقا ترغب في تشغيل فقط أمر واحد ، لماذا لا سلبيات واحد و تشغيله ؟ مثل ذلك:

$ find /foo  -name '*.txt' | xargs echo | sed -e 's/^/cp /' -e 's|$| /dest|' | bash -sx

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

cp: will not overwrite just-created `/dest/tubguide.tex' with `./texmf/tex/plain/tugboat/tubguide.tex'

أعتقد أنظف هو:

$ find /foo  -name '*.txt' | xargs -i cp {} /dest

أقل جملة تذكر من -exec الخيار.

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

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