سؤال كيف يمكنني نسخ الملفات بشكل متكرر بواسطة امتداد الملف ، والحفاظ على بنية الدليل؟


في سطر أوامر Linux ، أرغب في نسخ مجموعة (كبيرة جدًا) من .txt الملفات من دليل واحد (والدلائل الفرعية الخاصة به) إلى آخر.

أحتاج بنية الدليل للبقاء سليمة ، ولست بحاجة إلى تجاهل الملفات باستثناء تلك المنتهية في .txt.


68
2018-06-21 04:41


الأصل


بعد الحصول على cp والعثور على علامات في سؤالك ، هل يعني ذلك أنك مرتبطة بهذه الخيارات؟ نظرًا لأن مجموعة البيانات كبيرة جدًا ، فمن المنطقي الافتراض أن عملية النسخ يمكن أن تتوقف لأسباب معينة وسيتعين عليك إعادة تشغيلها. لست متأكدًا من أن طريقة البحث / cp ستتمكن من استئناف النقل ونسخ الجزء المفقود فقط. إذا لم تكن مرتبطًا بالعثور على / cp ، فيمكنك التفكير في rsync ، وهو أكثر ذكاءً. - الخيار --exclude سوف يخدعك لتخطي ملفات txt. - vtest
دعوة عادلة - ربما rsync هو الخيار الأفضل. لا ترتبط بالعثور على / cp. (اعتدت على أي حال - لم يتم تثبيت rsync على الجهاز البعيد ، وكان خادم الويب حية وأردت أن أترك أصغر قدر ممكن من البصمة) - unclaimedbaggage


الأجوبة:


يمكنك استخدام تجد و CPIO لفعل هذا

cd /top/level/to/copy
find . -name '*.txt' | cpio -pdm /path/to/destdir

(-updm for overwrite destination content.)

91
2018-06-21 07:29



لماذا م؟ اعتقدت فقط للحفاظ على تاريخ تعديل الملف. - Mubashar Ahmad


cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;

7
2018-06-21 08:13



أنت في عداد المفقودين . بعد find. أيضا على macOS 10.13.1 ، وهذا عمل: find . -type f -name "*.txt" -exec install -v {} /dest/path/{} \; - grim


مقاربة أخرى

find . -name '*.txt' -exec rsync -R {} path/to/dext \;


2
2018-01-18 02:31



أنا أحب هذا الحل. انا إستعملت find . -iname '*.txt' -exec rsync -Rptgon {} path/to/dext \; للقيام بملف غير حساس لحالة الأحرف والملكية المخولة. - MountainX


أسهل طريقة عملت لي:

cp --parents -R jobs/**/*.xml ./backup/

صيد واحد هو عليك الانتقال إلى الدليل "المطلوب" قبل ذلك "المسار الأصل" هو الصحيح.

تأكد أيضًا من تمكينك للعواطف المتكرّرة في bash:

shopt -s globstar

1
2017-09-11 21:21





ماذا عن أول نسخة منه مع

cp -r /old/folder /new/folder

ثم انتقل إلى المجلد الجديد وتشغيل

find . -type f ! -iname "*.txt" -delete

أو فقط

cp -r /old/folder /new/folder && find . -type f ! -iname "*.txt" -delete

تحرير: طيب تريد أمر واحد الذي يرشح (أنا لم تختبر هذا لأن النظام الخاص بي لا يملك cpio أمر!). هنا حيث وجدت: http://www.gnu.org/software/findutils/manual/html_mono/find.html#Copying-A-Subset-of-Files

find . -name "*.txt" -print0 |
     cpio -pmd0 /dest-dir

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


1
2018-06-21 05:03



الإيماءات هتاف - وهذا من شأنه أن يعمل ، ولكن دون تصفية ل. txt أنا أبحث في بضعة ملايين الملفات (الخروج على بعد بضع مئات غيغابايت). إذا لزم الأمر ، فقد أضطر إلى ذلك ، ولكني أحب التصفية أثناء النسخ إن أمكن - unclaimedbaggage
هتاف ، يعمل الإصدار المعدل إذا قمت بإزالة "0" من -pmd0 - unclaimedbaggage
يجب عليك الحفاظ على 0 في -pmd0 و أضف -print0 الى نهاية ال find القيادة (فقط قبل |). - G-Man


انتقل إلى الدليل:

find . -regex '<regexp_to_get_directories_and_files_you_want>' | xargs -i cp -r --parents {} path/to/destination

انها قليلا أكثر إلى الأمام والأقوياء ، إذا كنت تدير التعبيرات العادية.


0
2017-10-12 11:25





انتقل إلى الدليل:

cp '*.css' /path/to/destination

سيكون عليك الانتقال إلى كل مجلد في الدليل ، ولكن هذا أفضل من معظم الخيارات التي رأيتها حتى الآن.


-1
2017-10-20 20:29



هذه الطريقة ليست عودية ، وهذا يعني أنه بالنسبة للدلائل الكبيرة ، يمكنك القيام بذلك لفترة طويلة ... - Iain Reid