उन सभी फ़ोल्डरों की प्रतिलिपि कैसे करें जिनमें एक विशिष्ट फ़ाइल है


17

मैं केवल अपने FLAC म्यूजिक फोल्डर का बैकअप लेना चाहता हूं। FLAC फ़ाइलों को फ़ोल्डर्स के अंदर इस तरह घोंसला बनाया जा सकता है:

AlbumName/
├── Files/
│   ├── someSong01.flac
│   ├── someSong02.flac
├── Covers/
│   ├── someCover01.jpg
│   └── someCover02.jpg

मैं सभी एल्बमनाम के फ़ोल्डरों को उनकी संगत संरचना और सामग्री के साथ कैसे कॉपी और स्थानांतरित करूं, जिसमें कम से कम एक FLAC फाइल अंदर हो (मैं मानूंगा कि यह कहने के लिए पर्याप्त है: संगीत FLAC प्रारूप में है)

संपादित करें: FLAC फ़ाइलों को नेस्टेड किया जा सकता है; तो मेरे पास हो सकता है:

AlbumName2/
├── someSong01.flac
├── someSong02.flac
├── Covers/
│   ├── someCover01.jpg
|   └── someCover02.jpg

और मैं उन फ़ोल्डरों को उनकी सभी सामग्री के साथ कॉपी करना चाहता हूं, न केवल एफएलएसी फाइलें, और किसी अन्य निर्देशिका में पेस्ट करें।

तो अगर मेरे पास भी है

AlbumName3/
├── someSong01.mp3
├── someSong02.mp3
├── Covers/
│   ├── someCover01.jpg
|   └── someHiddenSong.flac

तथा

AlbumName4/
├── Files/
│   ├── someSong01.mp3
│   ├── someSong02.mp3
├── Covers/
│   ├── someCover01.jpg
│   └── someCover02.jpg

मैं एक और निर्देशिका के लिए पुनरावर्ती चाहते हैं

संपादित करें: कोई भी उत्तर वास्तव में वह नहीं कर रहा था जो मैं चाहता हूं, इसलिए मैंने कुछ इस तरह से उपयोग किया:

 find -mindepth 2 -name '*.flac' -exec dirname {} \; | awk -F "/" '{print $2}' | sort -u | while read -r dirname; do cp -r "$dirname" "backup/"; done

मूल रूप से मैं सभी flac फ़ाइलों को सूचीबद्ध करता हूं, मैं awk का उपयोग करके रूट फ़ोल्डर को पुनः प्राप्त करता हूं, मैं डुप्लिकेट हटाता हूं और मैं वही करता हूं जो मैं चाहता हूं


बैकअप कहां, आपकी मंजिल क्या है?
जॉर्ज उडोसन

क्या केवल flac फ़ाइलों की प्रतिलिपि बनाने की आवश्यकता है या पूरे फ़ोल्डर में कम से कम एक flac फ़ाइल है?
कोई नहीं

@ कोई भी फ़ोल्डर नहीं: " मैं अपनी संगत संरचना और सामग्री के साथ सभी एल्बमनाम के फ़ोल्डर्स को कैसे कॉपी और स्थानांतरित कर सकता हूं , जिसमें कम से कम एक FLAC फाइल के अंदर कहीं भी हो "
टेराडॉन

जवाबों:


19

एक विकल्प rsync का उपयोग करना है, जो केवल flac फ़ाइलों को कॉपी करता है और निर्देशिका संरचना को संरक्षित करता है:

rsync -avzm --include=*/ --include=*.flac --exclude=* albums/ backup/
  • एक संग्रह
  • v क्रिया
  • z स्थानांतरण के दौरान संपीड़ित करना (समान कंप्यूटर पर उपयोगी प्रतिलिपि नहीं हो सकता है)
  • m prune खाली dirs
  • पहले सभी निर्देशिकाओं को शामिल करता है
  • दूसरे में शामिल हैं फ्लैक फाइलें
  • अंतिम बहिष्करण अन्य सभी फ़ाइलों को शामिल नहीं करता है

वास्तव में? मैं समझता हूं, वह निर्देशिका संरचना को संरक्षित करना चाहता है। वह कहता है: "मैं सभी एल्बमनाम के फ़ोल्डरों को उनकी संगत संरचना और सामग्री के साथ कैसे कॉपी और स्थानांतरित कर सकता हूं ..."।
कोई नहीं

2
ओह मैं समझा। मुझे यकीन नहीं है। क्या केवल flac फ़ाइलों की प्रतिलिपि बनाने की आवश्यकता है या पूरे फ़ोल्डर में कम से कम एक flac फ़ाइल है?
कोई नहीं

सवाल संपादित किया जाता है और अब यह और अधिक विस्तार से बताता है, फ्रिकडेल क्या चाहता है। ध्यान में रखा जाता है कि सभी सामग्री की प्रतिलिपि बनाई जाएगी, अगर कोई flac फ़ाइल है, तो मेरा उत्तर गलत है क्योंकि यह केवल flac फ़ाइलों की प्रतिलिपि बनाता है। हालाँकि यह अभी भी किसी अन्य उद्देश्य के लिए उपयोगी हो सकता है।
कोई भी

9

हाय मेरे दोस्त आप उपयोग कर सकते हैं

mkdir newdirectory
cp -r --parents */*.flac newdirectory/

2
--parentsपहले कभी अच्छा नहीं हुआ !
जॉर्ज उडोसन

4
कृपया इसे समझाएं */*.flac! विल cp -r --parents AlbumName/ newdirectory/पर्याप्त नहीं?
जॉर्ज उडोसन

3
सवाल से, ऐसा लगता है कि flacs नेस्टेड निर्देशिकाओं में हो सकते हैं या नहीं भी हो सकते हैं, इसलिए मैं ग्लोबस्टार ( shopt -s globstar) को सक्षम करने की सलाह दूंगा , फिर **/*.flacग्लोब के लिए उपयोग करें । डबल-स्टार शून्य या अधिक निर्देशिकाओं से मेल खाएगा।
वेजेंड्रिया

आप बिल्कुल सही हैं, मैं अपने सवाल को संपादित करता हूं, इसलिए हर कोई समझता है
fricadelle

5

अच्छा जवाब

मैं एक और तरीका जोड़ना चाहता हूं, आप खोज और सीपीआई के संयोजन का भी उपयोग कर सकते हैं

find . -name "*.flac" -print0|cpio --null -pdm destination/

स्पष्टीकरण:

GNU find searches the directory tree rooted at each given file name by evaluating the given expression from left to right, according to the rules of precedence (see Operators), until the outcome is known (the left-hand side is false for AND operations, true for OR), at which point find moves on to the next file name.

GNU cpio is a tool for creating and extracting archives, or copying files from one place to another. It handles a number of cpio formats as well as reading and writing tar files.

3 cpio मोड हैं:

  • कॉपी-आउट मोड: In copy-out mode, cpio copies files into an archive. It reads a list of filenames, one per line, on the standard input, and writes the archive onto the standard output.

  • कॉपी-इन मोड: In copy-in mode, cpio copies files out of an archive or lists the archive contents. It reads the archive from the standard input.

  • कॉपी-पास मोड: In copy-pass mode, cpio copies files from one directory tree to another, combining the copy-out and copy-in steps without actually using an archive. It reads the list of files to copy from the standard input; the directory into which it will copy them is given as a non-option argument.

यहां, हम कॉपी-पास मोड का उपयोग कर रहे हैं।

  • उपरोक्त आदेश में उपयोग किए गए विकल्प:

लगता है:

  • -नाम -> फ़ाइल का नाम या पूर्ण नाम लिखने के बजाय रेगेक्स का उपयोग करें

केन्द्रीय लोक सूचना अधिकारी:

  • '-m, - सुरक्षित-संशोधन-समय' Retain previous file modification times when creating files.
  • '-P, - पास के माध्यम से' Run in copy-pass mode. see ``Copy-pass mode``.
  • '-d, --मेक-निर्देशिका' Create leading directories where needed.'
  • --quiet' कॉपी किए गए ब्लॉकों की संख्या को प्रिंट न करें। `

New options are the "-print0" available with GNU find, combined with the "--null" option of cpio. These two options act together to send file names between find and cpio, even if special characters are embedded in the file names.

rsyncनिर्देशिका संरचना के साथ फ़ाइलों को खोजने और कॉपी करने के लिए शेल स्क्रिप्ट का उपयोग या लेखन भी कर सकते हैं ।

Rsync स्पष्टीकरण के लिए, कृपया उपरोक्त उत्तरों पर एक नज़र डालें।


2
आप कमांड के स्पष्टीकरण और आपके द्वारा सुझाए गए विकल्पों को शामिल करके अपने उत्तर को बेहतर बना सकते हैं। - रिव्यू से
जे। स्टारन्स

@ मिठाई हाँ, सही है। शुक्रिया, आपके सही सुझाव के लिए।
bsdboy

4

उत्तर 1: आप findउसी के लिए कमांड का उपयोग भी कर सकते हैं ।

mkdir newDir && find AlbumName/ -iname "*.flac" -exec cp --parents "{}" newDir/ \;

explaination:

mkdirनई निर्देशिका बनाता है। findआदेश फ़ोल्डर *.flacमें स्थित फ़ाइलों को ढूँढता है AlbumNameexecकमांड cpउस प्रत्येक फ़ाइलनाम पर कमांड निष्पादित करता है जो findवापस आ गया है।

2 उत्तर: तुम भी उपयोग कर सकते हैं findके साथ आदेश xargsके साथ-साथ

mkdir newDir && find AlbumName/ -iname "*.flac" | xargs -I{} cp --parents {} newDir/

अधिक जानकारी: ढूँढें , xargs


1
find | xargsरिक्त स्थान के साथ filenames पर टूट जाएगा, बल्कि find -print0 | xargs -0इसके बजाय का उपयोग करें ।
मिठाई

मैं 1 2.flacफ़ाइल के साथ फ़ाइल नाम में जगह की कोशिश की । क्या आप कृपया मुझे उस फ़ाइल का नाम बता सकते हैं जिस पर find | xargsविफल रहता है?
mf_starboi_8041


मुझे नहीं पता, लेकिन मैं लंबे नाम वाली फाइल को कॉपी करने में सक्षम हूं, जिसमें बिना स्पेस के इस्तेमाल होता हैfind -print0 | xargs -0
mf_starboi_8041

कोशिश करो touch "a space" && find . | xargs ls
डेसर्ट

0

बस मेरे संगीत पुस्तकालय के लिए एक ही समस्या को हल करने के लिए था और निम्न अनुकूलित स्क्रिप्ट का उपयोग करके इसे हल किया। मैंने इसे पूरी तरह से अर्थात चरों के साथ इंजीनियर नहीं किया, क्योंकि मैं केवल एक बार इसका उपयोग करने का इरादा रखता हूँ :)।

स्क्रिप्ट rcync का उपयोग करके प्रत्येक निर्देशिका को सभी अन्य फ़ाइलों और उपनिर्देशिकाओं सहित flac फ़ाइलों को एक नए स्थान पर ले जाती है। यदि यह प्रक्रिया के दौरान बंद हो जाता है तो rsync आपको स्क्रिप्ट को फिर से शुरू करने की अनुमति देता है।

मेरी लाइब्रेरी संरचना:

library
|-artist
  |- album 1 (mp3)
  |- album 2 (flac)

नई लाइब्रेरी संरचना:

library
|-artist
  |- album 1 (mp3)

library-lossless
|-artist
  |- album 2 (flac)

(1) SOURCE गंतव्य में निम्नलिखित शेल स्क्रिप्ट शुरू करें (अपनी पसंद के संबंधित निर्देशिका के साथ TARGET को बदलें - मैंने अभी पूर्ण पथ का उपयोग किया है)

पंक्ति 1: सभी निर्देशिकाओं को खोजें जिसमें flac फाइलें और पाइप (!) हैं, जो क्रमबद्ध
पंक्ति 2 में हैं: डुप्लिकेट
पंक्ति 3 में सूची और क्रमांक के साथ डुप्लिकेट को हटा दें : प्रत्येक निर्देशिका के लिए
पंक्ति 4 करें: प्रक्रिया
पंक्ति 5 में निर्देशिका दिखाएं : लक्ष्य निर्देशिका में rsync प्लस और स्रोत निकालें और लक्ष्य स्थान
पंक्ति में संरचना (-R) को संरक्षित करें 6: खाली निर्देशिका को हटा दें (क्योंकि rsync केवल फ़ाइलों को हटाता है)

find . -type f -name \*.flac -printf "%h\n" | 
sort -u | 
while read -r dirname; do
    echo $dirname
    rsync -azvm -R --remove-source-files "${dirname}" TARGET
    find "${dirname}" -type d -delete
done

(2) स्क्रिप्ट को सफलतापूर्वक निष्पादित करने के बाद (1) आप स्रोत निर्देशिका में निम्न कमांड निष्पादित कर सकते हैं

find . -depth -type d -empty -delete

यह आदेश स्क्रिप्ट के भीतर हटाए नहीं गए सभी खाली निर्देशिकाओं को हटा देता है। Ie "कलाकार" निर्देशिका, जहाँ सभी सबफ़ोल्डर्स / एल्बमों में flac फाइलें शामिल होती हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.