मेरे पास कई निर्देशिकाओं में .zip फ़ाइलों का एक गुच्छा है:
Fol1/Fol2
Fol3
Fol4/Fol5
मैं उन सभी को एक सामान्य आधार फ़ोल्डर में कैसे ले जाऊंगा?
मेरे पास कई निर्देशिकाओं में .zip फ़ाइलों का एक गुच्छा है:
Fol1/Fol2
Fol3
Fol4/Fol5
मैं उन सभी को एक सामान्य आधार फ़ोल्डर में कैसे ले जाऊंगा?
जवाबों:
जिप फ़ाइलों ( 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
काम करने के लिए इसे बदलना पड़ा ।
.
को GNU खोजने के लिए निहित है, लेकिन दूसरों के लिए नहीं, मैंने इसे स्पष्ट रूप से जोड़ा है।
यदि आप bash संस्करण 4 या उच्चतर या zsh का उपयोग कर रहे हैं, तो आप पुनरावर्ती ग्लोबिंग का भी उपयोग कर सकते हैं:
mv **/*.zip /path/to/move/zip/files/to
यह केवल फाइलों को स्थानांतरित करेगा और उनके सापेक्ष पथ नहीं, इसलिए टकराव हो सकता है।
यह एक सुरक्षित है जब डेटा और त्रुटि मुक्त चलती है जो सभी 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 फ़ाइलों को प्रदर्शित करेगा।
;
है
बैश हैक के रूप में, आप की शक्ति का उपयोग कर सकते हैं 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
सामग्री के)।
मान लें कि आपके पास खोज और mv के GNU संस्करण हैं, तो निम्नलिखित मौजूदा खोज-आधारित उत्तरों की तुलना में अधिक कुशल होंगे:
find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +
खोज +
के अंत में उपयोग करना -exec का अर्थ है कि फ़ाइलों की एक सूची को mv कमांड में पारित किया जाएगा, बजाय प्रति मिली एक mv कमांड को निष्पादित करने के बजाय। हालाँकि, इसकी एक सीमा यह है कि आप केवल कमांड के अंत में '{}' रख सकते हैं, जो mv --target-directory विकल्प के उपयोग की आवश्यकता है, और जहाँ तक मुझे पता है कि यह एक GNU-ism है।