मैं फ़ाइल एक्सटेंशन द्वारा निर्देशिका संरचना को संरक्षित करते हुए फ़ाइलों की प्रतिलिपि कैसे बना सकता हूं?


71

लिनक्स कमांड लाइन में, मैं .txtएक निर्देशिका (और इसकी उपनिर्देशिका) से फ़ाइलों के एक (बहुत बड़े) सेट को कॉपी करना चाहूंगा ।

मुझे अक्षुण्ण बने रहने के लिए निर्देशिका संरचना की आवश्यकता है, और मुझे उन फाइलों को अनदेखा करने की आवश्यकता है, जिनमें अंत नहीं है .txt


2
Cp होने और अपने प्रश्न में टैग के रूप में खोजने का मतलब है कि क्या आप इन विकल्पों से बंधे हैं? चूंकि आपका डेटासेट बहुत बड़ा है, इसलिए यह समझ में आता है कि नकल की प्रक्रिया कुछ कारणों से बाधित हो सकती है और आपको इसे फिर से शुरू करना होगा। मुझे यकीन नहीं है कि खोज / सीपी दृष्टिकोण स्थानांतरण को फिर से शुरू करने और केवल लापता भाग की प्रतिलिपि बनाने में सक्षम होगा। यदि आप खोजने / cp से बंधे नहीं हैं, तो आप rsync पर विचार कर सकते हैं, जो कि होशियार है। इसका --exclude विकल्प आपको .txt फ़ाइलों को छोड़ने के लिए बदल देगा।
vtest

फेयर कॉल - rsync शायद बेहतर विकल्प है। खोजने के लिए बंधे नहीं / सीपी। (मैं उन्हें वैसे भी इस्तेमाल करता था - rsync रिमोट मशीन पर स्थापित नहीं था, यह एक लाइव वेब सर्वर था और मैं जितना संभव हो उतना छोटा पदचिह्न छोड़ना चाहता था)
लावारिस बैगेज

जवाबों:


95

आप ऐसा करने के लिए खोज और cpio का उपयोग कर सकते हैं

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

(-updm for overwrite destination content.)

क्यों मी? मैंने सोचा कि इसकी फाइल को संशोधित करने की तारीख को बनाए रखना है।
मुबाशर

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

आप एक के .बाद याद कर रहे हैं find। इसके अलावा macOS 10.13.1 पर, इसने काम किया:find . -type f -name "*.txt" -exec install -v {} /dest/path/{} \;
ग्रिम

2

एक और दृष्टिकोण

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


मुझे यह समाधान पसंद है। मैं find . -iname '*.txt' -exec rsync -Rptgon {} path/to/dext \;केस असंवेदनशील मिलान और स्वामित्व और अनुमतियों को प्रस्तुत करने के लिए उपयोग करता था।
MountainX

1

सबसे आसान तरीका है कि मेरे लिए काम किया:

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

एक कैच आपको "अभिभावक पथ" सही होने से पहले "वांछित" निर्देशिका में नेविगेट करना होगा।

यह भी सुनिश्चित करें कि आपने bash में पुनरावर्ती ग्लोब सक्षम किया है:

shopt -s globstar

1

कैसे के बारे में आप पहली बार के साथ इसे कॉपी करें

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
चीयर्स, एडिट किया हुआ वर्जन काम करता है अगर मैं '0' को -pmd0 से हटा देता हूं
लावारिस

आप रखना चाहिए 0में -pmd0और जोड़ने -print0के अंत में findआदेश (बस से पहले |)।
जी-मैन

1

मैं macOS पर एक ही काम करने की कोशिश कर रहा था, लेकिन वास्तव में मेरे लिए कोई भी विकल्प काम नहीं करता था। जब तक मुझे पता चला ditto

मुझे कई .wav फ़ाइलों की प्रतिलिपि बनानी पड़ी, और यह वीडियो फ़ाइलों को छोड़ना है ... तो यहाँ है कि मैं क्या लेकर आया हूँ:

find . -type f -iname "*.wav" -ls -exec ditto {} /destination/folder/{} \;

  • find .- चालू फ़ोल्डर में रन मिलते हैं। cd /source/folderशुरू करने से पहले सुनिश्चित करें

  • -type f - केवल फाइलों को देखने के लिए निर्दिष्ट करता है

  • -iname "*.wav" - यह इसे असंवेदनशील * .wav देखने के लिए कहता है
  • -ls- यह आपको उस फ़ाइल को दिखाता है जिस पर वह काम कर रहा है। इसके अलावा अन्य कुछ नहीं दिखाता है।
  • -exec ditto {} /destination/folder/{} \; - एक ही डायरेक्टरी ट्री से फाइलों को कॉपी करने और बनाने का सारा काम करता है।

0

निर्देशिका पर नेविगेट करें:

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

यदि आप नियमित अभिव्यक्ति का प्रबंधन करते हैं, तो यह थोड़ा अधिक सीधे और शक्तिशाली है।


-1

निर्देशिका पर नेविगेट करें:

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

आपको निर्देशिका में प्रत्येक फ़ोल्डर में नेविगेट करना होगा, लेकिन यह उन सभी विकल्पों से बेहतर है जिन्हें मैंने अब तक देखा है।


यह विधि पुनरावर्ती नहीं है, जिसका अर्थ है कि बड़ी निर्देशिकाओं के लिए आप इसे काफी समय तक कर सकते हैं ...
Iain Reid
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.