एक निर्देशिका में कई उपनिर्देशिकाओं से एक निश्चित विस्तार के साथ सभी फाइलों को स्थानांतरित करें


43

मेरे पास कई निर्देशिकाओं में .zip फ़ाइलों का एक गुच्छा है:

Fol1/Fol2
Fol3
Fol4/Fol5

मैं उन सभी को एक सामान्य आधार फ़ोल्डर में कैसे ले जाऊंगा?


क्या आप निर्देशिका संरचना रखना चाहते हैं? आप निर्देशिकाओं को स्थानांतरित करना चाहते हैं, या सिर्फ ज़िप फाइलें?
जोर्डनम

मैं सिर्फ जिप फाइल को मूव करना चाहता हूं। मैं वास्तव में निर्देशिकाओं के बारे में परवाह नहीं करता हूं - उन्हें अकेले छोड़ दिया जा सकता है या हटाया जा सकता है।
inquilineKea

जवाबों:


55

जिप फ़ाइलों ( cd …) युक्त ट्री के टॉपवेल डायरेक्टरी पर जाएं , फिर रन करें

mv **/*.zip /path/to/single/target/directory

यह बॉक्स के बाहर zsh में काम करता है। यदि आपका शेल बैश है, तो आपको shopt -s globstarपहले दौड़ना होगा (आप कर सकते हैं और इस कमांड को अपने में रखना चाहिए ~/.bashrc)। यदि आपका शेल ksh है, तो आपको set -o globstarपहले (इसे अपने में रखना ~/.kshrc) चलाना होगा ।

वैकल्पिक रूप से, उपयोग करें find, जो बिना किसी विशेष तैयारी के हर जगह काम करता है लेकिन अधिक जटिल है:

find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;

यदि आप खाली निर्देशिकाओं को बाद में, zsh में हटाना चाहते हैं:

rmdir **/*(/^Fod)

बैश या क्ष में:

rmdir **/*/

और जब तक हटाने के लिए खाली निर्देशिकाएं हैं तब तक दोहराएं। वैकल्पिक रूप से, किसी भी खोल में

find . -depth -type d -empty -exec rmdir {} \;

findऊपर की पहली कमान ने काम किया, लेकिन उसे find . -nameकाम करने के लिए इसे बदलना पड़ा ।
जेफटॉमपसन

1
@ जेफ .को GNU खोजने के लिए निहित है, लेकिन दूसरों के लिए नहीं, मैंने इसे स्पष्ट रूप से जोड़ा है।
गिल्स एसओ- बुराई को रोकना '29

13

यदि आप केवल .zipफ़ाइलों को स्थानांतरित करना चाहते हैं , तो आप कुछ ऐसा कर सकते हैं

mkdir ./zipfiles
find . -name "*.zip" -exec mv "{}" ./zipfiles \;

3

यदि आप bash संस्करण 4 या उच्चतर या zsh का उपयोग कर रहे हैं, तो आप पुनरावर्ती ग्लोबिंग का भी उपयोग कर सकते हैं:

mv **/*.zip /path/to/move/zip/files/to

यह केवल फाइलों को स्थानांतरित करेगा और उनके सापेक्ष पथ नहीं, इसलिए टकराव हो सकता है।


आप रिश्तेदार रास्तों से क्या मतलब है?
कुनोक

2

यह एक सुरक्षित है जब डेटा और त्रुटि मुक्त चलती है जो सभी distro के अधिकांश की परवाह किए बिना संस्करणों का समर्थन करता है। यह कमांड उपनिर्देशिका को स्कैन करेगा और फिर अपने नए गंतव्य निर्देशिका में स्थानांतरित या कॉपी करेगा।

find . -name *.flac -exec mv '{}' "./flac/" ";"
  • इस कमांड को मुख्य डायरेक्टरी में चलाएं जिसमें उन उप-निर्देशिकाओं को शामिल किया गया है जिन्हें आप स्थानांतरित करना चाहते हैं।
  • जहां आप अपने मामले में *.flacकुछ भी बदल सकते हैं *.zip। या *.docसिर्फ कोई एक्सटेंशन काम करता है।
  • और mvफ़ाइलों को स्थानांतरित करने के लिए कमांड है, या आप cpडेटा को स्थानांतरित करने के बजाय कॉपी करने के लिए उपयोग कर सकते हैं ।
  • ./flac/वह गंतव्य निर्देशिका है जिसे मैं सभी FLAC फ़ाइलों को स्थानांतरित करना चाहता हूं। आप भी इसे पूरा रास्ता दे सकते हैं/home/myid/flac/

पूर्ण उदाहरण। (इस मामले में, संगीत कलाकार के नाम के साथ कई उपनिर्देशिकाएँ हैं /home/myid/Music/और फिर FLAC फाइलें सभी अलग-अलग उपनिर्देशिकाओं के स्तर पर हैं। चूंकि मुझे कलाकार फ़ोल्डर की आवश्यकता नहीं है, लेकिन सभी FLAC फ़ाइलों को एक निर्देशिका में रखना चाहते हैं।/home/myid/Music/flac/

cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls

फिर यह सभी FLAC फ़ाइलों को प्रदर्शित करेगा।


क्या करता ;है
फ्रांसेस्को बोई

@FrancescoBoi यह सुनिश्चित करें कि जब तक एक ही लाइन में bash कमांड खत्म न हो जाए तब तक प्रतीक्षा करें। और फिर बैश कमांड की अगली पंक्ति पर जाएं। यह उन कमांड्स के लिए उपयोगी है, जिनमें .pl या python जैसी स्क्रिप्ट हैं क्योंकि bash बस इसे चलाएगा और फिर अगली पंक्ति में जाएगा, इसलिए सुरक्षित रहने के लिए, मैं उपयोग करता हूं; आदेशों के बाद जो समय या स्क्रिप्ट लेता है, अगर मामले में इसे छोड़ दिया जाता है।
सीडेक्स

0

बैश हैक के रूप में, आप की शक्ति का उपयोग कर सकते हैं tar:

(cd origin/;find . -exec file --mime-type "{}" \;|grep "application/zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr origin/

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

फाइनल rmसिर्फ मूल फाइलों को हटाने के लिए है (becouse @InquilineKea सूत्रों का कहना है कि वह टिप्पणी में मूल फ़ोल्डर के बारे में परवाह नहीं करता है)।

बेशक यह विशेष रूप से उपयुक्त है यदि मूल / और लक्ष्य / फ़ोल्डर अलग-अलग डिस्क पर हैं। अन्यथा प्रस्तावित अन्य समाधान अधिक कुशल हैं (भले ही वे नामकरण परंपराओं पर भरोसा करते हों, बजाय इसके कि fileसामग्री के)।


0

मान लें कि आपके पास खोज और mv के GNU संस्करण हैं, तो निम्नलिखित मौजूदा खोज-आधारित उत्तरों की तुलना में अधिक कुशल होंगे:

find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +

खोज +के अंत में उपयोग करना -exec का अर्थ है कि फ़ाइलों की एक सूची को mv कमांड में पारित किया जाएगा, बजाय प्रति मिली एक mv कमांड को निष्पादित करने के बजाय। हालाँकि, इसकी एक सीमा यह है कि आप केवल कमांड के अंत में '{}' रख सकते हैं, जो mv --target-directory विकल्प के उपयोग की आवश्यकता है, और जहाँ तक मुझे पता है कि यह एक GNU-ism है।

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