फ़ोल्डर संरचना को ध्यान में रखते हुए विशिष्ट फ़ाइल प्रकार की प्रतिलिपि बनाएँ


108

मेरे पास एक फ़ोल्डर संरचना है जिसमें फ़ोल्डरों में बिखरी हुई * .csv फाइलें हैं। अब मैं फ़ोल्डर संरचना को रखते हुए सभी * .csv फ़ाइलों को किसी अन्य गंतव्य पर कॉपी करना चाहता हूं।

यह करके काम करता है:

cp --parents *.csv /target
cp --parents */*.csv" /target
cp --parents */*/*.csv /target
cp --parents */*/*/*.csv /target
...

और इसी तरह, लेकिन मैं इसे एक कमांड का उपयोग करके करना चाहूंगा।

जवाबों:


126

क्या कोई कारण है कि लोग खोज के उपयोग का विरोध करते हैं -exec? यह बहुत आसान है।

find . -name '*.csv' -exec cp --parents \{\} /target \;

अपने औजारों को जानें। ;-)


62
शायद इस \ {\} \ के कारण;
igo

12
'{}'ठीक वैसे ही काम करता है
OrangeDog

3
भले ही -execdirसुरक्षित है -exec, बस एक को दूसरे के साथ बदलने के रूप में फ़ोल्डर संरचना को संरक्षित नहीं करता है।
शमौन शाइन

2
जब मैं आपकी आज्ञा से उन्हें कॉपी करने का प्रयास करता हूं तो मुझे 'ओमिटिंग निर्देशिका' संदेश क्यों मिलता है?
विक्की देव

4
क्या आप बता सकते हैं कि ब्रेसिज़ को यहाँ क्यों भागना पड़ता है?
नौमेनन

46

आप इसके लिए भी इस्तेमाल कर सकते हैं rsync

$ rsync -a --prune-empty-dirs --include '*/' --include '*.csv' --exclude '*' source/ target/

यदि आप स्रोत ट्री से खाली निर्देशिका रखना चाहते हैं, तो --prune-empty-dirsविकल्प छोड़ें :

$ rsync -a --include '*/' --include '*.csv' --exclude '*' source/ target/

यदि आप सिमिलिंक, संशोधन दिनांक, फ़ाइल अनुमतियां, स्वामी आदि संरक्षित नहीं करना चाहते हैं, तो कृपया -aअन्य संयोजन के साथ बदलें -rlptgoD। ;-)


1
-mके लिए एक शॉर्टकट है --prune-emty-dirs
गेरमिया सेप

साथ ही, -Rस्रोत की मूल निर्देशिका संरचना की प्रतिलिपि बनाने के लिए विकल्प जोड़ा जा सकता है। (cf. मेरा जवाब यहाँ।)
जेरमिया सेप

-आर मेरे लिए काम करता है! धन्यवाद
gigi2

32

आप मोड के माध्यम से पास में cpio खोज और cpio का उपयोग कर सकते हैं

find . -name '*.csv' | cpio -pdm  /target

यह सभी .csv फ़ाइलों को वर्तमान निर्देशिका में और नीचे मिलेगा और उन्हें कॉपी / निर्देशिका में बनाए हुए निर्देशिका संरचना को बनाए रखने के लिए लक्षित करें .

यदि तुम प्रयोग करते हो

find /path/to/files -name '*.csv' | cpio -pdm /target

यह सभी फ़ाइल को /path/to/filesनीचे और नीचे ढूंढेगा और उन्हें नीचे और नीचे कॉपी करेगा /target/path/to/files


3
मैंने सभी उत्तरों को ऊपर नीचे करने की कोशिश की, और यह एकमात्र ऐसा प्रयास था जिसने पहले प्रयास में काम किया था
OscarRyz

21

cpआदेश एकाधिक स्रोत तर्क परमिट:

cp **/*.csv --parents ../target

गुफा: मैं यहाँ एक पुनरावर्ती गोला का उपयोग कर रहा हूँ; यह globstarबैश 4+ और में विकल्प है ksh, और डिफ़ॉल्ट रूप से समर्थित है zsh। पुनरावर्ती ग्लोब छिपी हुई फ़ाइलों और फ़ोल्डरों से मेल नहीं खाते हैं, और कुछ कार्यान्वयन सिमिलिंक का पालन करते हैं जबकि अन्य नहीं करते हैं

यदि आपका शेल पुनरावर्ती ग्लब्स का समर्थन नहीं करता है, या यदि आप उन्हें उपयोग नहीं करना चाहते हैं, तो आप निम्न कार्य कर सकते हैं:

  • *.csv */*.csv */*/*.csv */*/*/*.csv - यह निश्चित रूप से बहुत बेमानी है और यह जानने की आवश्यकता है कि आपकी निर्देशिका संरचना कितनी गहरी है।
  • $(find . -name '*.csv')- यह छिपी हुई फ़ाइलों और फ़ोल्डरों से मेल खाएगा। findयह निर्दिष्ट करने का भी समर्थन करता है कि सहानुभूति का पालन किया जाता है या नहीं, जो उपयोगी हो सकता है।

यह वही है जो मैंने कोशिश की (पुनरावर्ती ग्लोब) और इसे कुछ मिला लेकिन सभी नहीं? बहुत अजीब। Npm copyfiles स्क्रिप्ट का उपयोग करते समय मुझे वही सटीक परिणाम मिला, लेकिन अगर मैं खोज कमांड का उपयोग करता हूं तो यह सबकुछ पाता है ...
Randyaa

@ रांड्या मुझे कुछ और विवरणों की आवश्यकता होगी जिन पर फाइलें, वास्तव में, आपकी मदद करने के लिए नहीं मिलीं। आपको यहाँ चर्चा मिल सकती है और पुनरावर्ती ग्लोब उपयोगी के सटीक व्यवहार के बारे में यहाँ जारी है
काइल स्ट्रैंड

1
पता चलता है कि किसी कारण से पुनरावर्ती ग्लोब को सक्षम नहीं किया गया था ... मैंने पहले कभी इसमें भाग नहीं लिया था, लेकिन मैंने इसे shopt -s globstarतुरंत अपने आदेश से पहले सिर्फ एक निष्पादन के साथ ठीक किया और सब ठीक है। पालन ​​करने के लिए धन्यवाद!
रंड्या

--parentsवही था जिसकी मुझे तलाश थी। साभार
जोश

17

यह एक मेरे लिए काम किया:

find -name "*.csv" | xargs cp --parents -t /target


सबसे सरल वाक्यविन्यास के साथ सर्वश्रेष्ठ उत्तर। ठीक काम करता है और याद रखना आसान है। कई मामलों find [things] | xargs [do stuff]में बहुत शक्तिशाली है।
रोज अंतरिक्ष यात्री

माना। कुछ अन्य उत्तरों की तुलना में बहुत सीधा।
टिम बी

1
टूटता है अगर आपके पास फ़ाइलनामों में रिक्त स्थान है
मिशेल पीकोलिनी

@MichelePiccolini स्पेस फिल्म्स में find -print0और के साथ संभाला जा सकता है xargs -0
पसस्टोपॉर्पिस्टी

8

यह मानते हुए कि आप इस संरचना ./sourceको ./destinationनिम्न से दोहराना चाहते हैं :

cd source
find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)

मैं एक पंक्ति के रूप में यह गिनने के लिए तैयार हूं कि cd sourceएक शेल बिलियन है।


2
मुझे नहीं लगता कि वह वास्तव में एक आदेश का मतलब है - सिर्फ उसके उदाहरण के बारे में

tar-Cपहले निर्देशिका को बदलने से बचने का विकल्प है।
बार्ट

8

से rsyncकी मैनपेज:

-आर, - अविश्वसनीय

सापेक्ष रास्तों का उपयोग करें। इसका मतलब यह है कि कमांड लाइन पर निर्दिष्ट पूर्ण पथ नाम फाइलनाम के सिर्फ पिछले हिस्सों के बजाय सर्वर को भेजे जाते हैं। यह विशेष रूप से तब उपयोगी होता है जब आप एक ही समय में कई अलग-अलग निर्देशिकाएँ भेजना चाहते हैं। उदाहरण के लिए, यदि आपने इस कमांड का उपयोग किया है:

rsync -av /foo/bar/baz.c remote:/tmp/

... यह रिमोट मशीन पर / tmp / baz.c नाम की एक फाइल बनाएगा। अगर इसके बजाय आपने इस्तेमाल किया

rsync -avR /foo/bar/baz.c remote:/tmp/

तब रिमोट मशीन पर /tmp/foo/bar/baz.c नामक एक फाइल बनाई जाएगी, जिससे उसका पूरा मार्ग संरक्षित होगा। इन अतिरिक्त पथ तत्वों को "निहित निर्देशिका" (अर्थात "फू" और उपरोक्त उदाहरण में "फू / बार" निर्देशिका) कहा जाता है।

तो, यह भी काम करेगा:

rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.