आप यूनिक्स में एक निश्चित प्रकार की सभी फाइलों को एक निर्देशिका में कैसे स्थानांतरित (या कॉपी) कर सकते हैं?


22

मैं grep/find/awk/xargsअभी तक की सभी चालों से बहुत परिचित नहीं हूँ ।

मेरे पास एक विशेष पैटर्न से मेल खाती कुछ फाइलें हैं, कहते हैं *.xxx। ये फाइलें एक निश्चित निर्देशिका में यादृच्छिक स्थानों पर हैं। मुझे ऐसी सभी फाइलें कैसे मिल सकती हैं, और उन्हें अपने होम डायरेक्टरी में यूनिक्स पर एक फ़ोल्डर में स्थानांतरित कर सकता हूं (जो अभी तक मौजूद नहीं है)?


4
आपको "फ़ाइल प्रकार" के बारे में बात करते समय ध्यान रखना चाहिए। यूनिक्स वातावरण में, ".xxx" उदाहरण विंडोज अर्थ में भी विस्तार नहीं है। ".xxx" केवल फ़ाइल नाम का एक प्रत्यय बनता है। "फ़ाइल प्रकार" कुछ श्रेणियों में से एक है: नियमित फ़ाइल, डिवाइस फ़ाइल, प्रतीकात्मक लिंक, निर्देशिका, नाम पाइप, यूनिक्स-परिवार सॉकेट, शायद कुछ अन्य।
ब्रूस एडगर

1
इसे भी देखें: unix.stackexchange.com/questions/7027/…
jasonwryan

@BruceEdiger धन्यवाद मुझे लगता है कि मैं वास्तव में "फ़ाइल नाम पैटर्न" का मतलब है
qodeninja

जवाबों:



17

यदि आप एक निर्देशिका पदानुक्रम के अंदर सभी फ़ाइलों को एकल गंतव्य निर्देशिका में, ≥4 (अपने shopt -s globstarमें रखना ~/.bashrc) या zsh में ले जाना चाहते हैं:

mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory

अन्य गोले में:

mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;

इस findकमांड को कैसे पढ़ें :

  • .: वर्तमान निर्देशिका को पार करना
  • -name '*.xxx': उन फाइलों पर कार्य करें जिनके नाम इस पैटर्न से मेल खाते हैं
  • -exec … \;: प्रत्येक फ़ाइल पर इस कमांड को निष्पादित करें, फ़ाइल के {}लिए पथ द्वारा प्रतिस्थापित

findयदि आपके पास बहुत सी फाइलें हैं, तो इसका उपयोग करने के लिए एक अधिक जटिल कमांड है, क्योंकि इसके mvलिए प्रत्येक फाइल के लिए एक अलग प्रक्रिया लागू करने की आवश्यकता नहीं है :

find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +

+अंत में बताता है findएक समय में एक से अधिक फ़ाइलों पर आदेश को लागू करने की। चूँकि findकेवल कमांड लाइन के अंत में फ़ाइल नाम रख सकते हैं, और mvगंतव्य निर्देशिका को अंतिम रूप देने की आवश्यकता है, हम तर्कों को पुनर्व्यवस्थित करने के लिए एक मध्यवर्ती शेल का उपयोग करते हैं (शेल के लिए "$0"पहला तर्क है ~/new-directory, और "$@"बाद के तर्क हैं) findका विस्तार {})।


4

यदि आप मिलान स्रोत फ़ाइलों की निर्देशिका संरचना को नई लक्ष्य निर्देशिका में बदलना चाहते हैं, तो आप GNU cp के --parents विकल्प का उपयोग कर सकते हैं :

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +

3

आप बिना खोज का उपयोग कर सकते -exec‍है और साथ ही:

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest

1
ध्यान दें कि find -execअधिक सुरक्षित है; उदाहरण के लिए, सफेद स्थान वाले फ़ाइल नामों पर विफल रहेगा।
14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.