2014-06-16 8 views
7

ओएस लिनक्स टकसालखोजने के लिए और टर्मिनल लिनक्स टकसाल का उपयोग कर निर्देशिका में सभी छवियों को कॉपी, समझने के लिए वाक्य रचना

तरह शीर्षक कहते हैं अंत में मैं खोजने के लिए और एक निर्देशिका में सभी छवियों को कॉपी करना चाहते हैं की कोशिश कर रहा।

मैंने पाया:

निर्देशिका में alls जेपीजी (या JPG) फ़ाइलें खोजने के लिए और फोल्डर/घर/जोआचिम/neu2 में उन्हें कॉपी:

find . -iname \*.jpg -print0 | xargs -I{} -0 cp -v {} /home/joachim/neu2 

और

खोज direcotry में सभी छवि फ़ाइलें:

find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' 

मेरी समस्या सबसे पहले है, मैं वास्तव में वाक्यविन्यास को समझ नहीं पा रहा हूं। क्या कोई कोड समझा सकता है? अग्रिम में)

अभिवादन और धन्यवाद;

और दूसरी बात किसी को एक कोड है कि जो मैं चाहता पैदा करने के लिए दोनों कोड कनेक्ट कर सकते हैं!

और फिर कोड का एक स्पष्टीकरण बहुत उपयोगी होगा।

उत्तर

15

सबसे पहले, समझें कि पाइप "|" लिंक एक दूसरे के रूप में दूसरे के आउटपुट को एक तर्क के रूप में पाइप करने का आदेश देता है। आपके दो शेल कोड अन्य कमांड (grep और xargs) में खोज कमांड के पाइप आउटपुट दोनों को नियंत्रित करते हैं। के एक के बाद एक उन आदेशों पर नजर डालते हैं:

पहले आदेश: लगता है

खोज (है कि खोजने के आदमी पेज से विवरण है) "एक निर्देशिका पदानुक्रम में फ़ाइलों के लिए खोज" करने के लिए एक कार्यक्रम है। वाक्यविन्यास (इस मामले में)

find <search directory> <search pattern> <action> 

दोनों स्थितियों में खोज निर्देशिका है। (वह वर्तमान निर्देशिका है)। ध्यान दें कि यह केवल वर्तमान निर्देशिका नहीं बल्कि इसकी सभी उपनिर्देशिकाओं को भी खोजता है (निर्देशिका पदानुक्रम)।

खोज पैटर्न विकल्प-नाम स्वीकार करता है (जिसका अर्थ है कि यह उन फ़ाइलों के लिए खोज करता है जिनमें से इस नाम के तर्क के रूप में दिए गए पैटर्न से मेल खाता है) या -नाम (नाम के समान ही मामला संवेदनशील है)।

क्रिया पैटर्न -print0 हो सकता है (दिए गए खोज निर्देशिका में यानी फ़ाइल के सापेक्ष या पूर्ण पथ में सटीक फ़ाइल नाम मुद्रित करें) या -exec (फ़ाइल पर दिए गए आदेश को निष्पादित करें) आदेश ";" के साथ समाप्त होना है और "{}" के प्रत्येक उदाहरण को फ़ाइल नाम से बदल दिया गया है)।

है यही कारण है कि, पहले खोल कोड (पहला भाग, पाइप के लिए छोड़ दिया)

find . -iname \*.jpg -print0 

खोजें वर्तमान निर्देशिका पदानुक्रम में ".jpg" समाप्त होने और उनके रास्ते और नाम प्रिंट के साथ सभी फ़ाइलों।दूसरा एक (पहला भाग)

find . -name '*' -exec file {} \; 

वर्तमान निर्देशिका पदानुक्रम में सभी फाइलों को पाता है और उन पर

file <filename> 

निष्पादित करता है। फ़ाइल एक और आदेश है जो फ़ाइल प्रकार को निर्धारित करता है और प्रिंट करता है (विवरण के लिए मैन पेज पर एक नज़र डालें, मैन फ़ाइल)।

दूसरा आदेश:

xargs एक कमांड "बनाता है और मानक इनपुट से exectues कमांड लाइन" (आदमी xargs) जो है, अर्थात खोज उत्पादन कि xargs में पहुंचाया जाता है से xargs। आदेश है कि यह बनाता है और कार्यान्वित परिभाषित करता है प्रतिस्थापन स्ट्रिंग, यानी की {} आदेश में इनपुट यह फ़ाइल से हो जाता है द्वारा प्रतिस्थापित किया जा रहा है हर मामले (कि

cp -v {} /home/joachim/neu2" 

विकल्प मैं {} इस मामले में है है, फाइलनाम)। विकल्प -0 परिभाषित करता है कि व्हाईटस्पेस या न्यूलाइन द्वारा इनपुट आइटम को समाप्त नहीं किया जाता है (केवल अलग) लेकिन केवल एक शून्य चरित्र द्वारा। Xargs इनपुट के रूप में खोजने के आउटपुट के साथ निपटने के लिए मानक तरीका का उपयोग करते समय यह आवश्यक लगता है।

कमांड जो बनाया गया है और निष्पादित किया गया है वह निश्चित रूप से विकल्प -v (verbose) के साथ कॉपी कमांड है और यह प्रत्येक फ़ाइल नामों को निर्देशिका में ढूंढने से कॉपी करता है।

तीसरा आदेश: ग्रेप

ग्रेप अपने इनपुट केवल उन पंक्तियों या तार है कि एक विशेष उत्पादन स्वरूप से मेल खाते दे फिल्टर। विकल्प -o grep को केवल मिलान करने वाली स्ट्रिंग को मुद्रित करने के लिए कहता है, न कि पूरी रेखा (मैन grep देखें), -पी इसे निम्न पैटर्न को एक perl regexp पैटर्न के रूप में समझाने के लिए कहता है। पर्ल रेगेक्स में,^लाइन की शुरुआत है, + + किसी भी मनमाने ढंग से स्ट्रिंग है, इसके बाद मनमाने ढंग से एक कोलन, एक स्थान, कई अल्फान्यूमेरिक वर्णों (पेर्ल रेगेक्स में डॉटोटेड \ डब्ल्यू +) में एक स्थान और स्ट्रिंग का पालन किया जाना चाहिए "छवि"। अनिवार्य रूप से यह grep कमांड फ़ाइल आउटपुट को केवल फाइलनामों को आउटपुट करने के लिए फ़ाइल आउटपुट फ़िल्टर करता है। (पर्ल के बारे में पढ़ें regex उदाहरण के लिए यहाँ: http://www.comp.leeds.ac.uk/Perl/matching.html)

आदेश आप वास्तव में

अब आप क्या करना है (1) (दूसरा शेल कमांड के उत्पादन में जो छवि फ़ाइलों को सूचीबद्ध ले चाहते हैं चाहता था), (2) इसे उचित रूप में लाएं और (3) इसे पहले शेल कमांड लाइन से xargs कमांड में पाइप करें (जो तब इच्छित कॉपी कमांड को बनाता है और निष्पादित करता है)। तो इस बार हमारे पास दो पाइप के साथ एक तीन (वास्तव में चार) चरण खोल कमांड है। एक समस्या नहीं है। हमारे पास पहले से चरण (1) और (3) हैं (हालांकि चरण (3) में हमें -0 विकल्प छोड़ने की आवश्यकता है क्योंकि इनपुट को आउटपुट नहीं मिल रहा है; हमें इसे न्यूलाइन को आइटम सेपरेटर्स के रूप में पेश करने की आवश्यकता है)।

चरण (2) अभी भी गायब है। मैं इसके लिए कट कमांड का उपयोग करने का सुझाव देता हूं। स्ट्रिंग्स को अलग-अलग क्षेत्रों में विभाजित करने में परिवर्तन करें (मूल स्ट्रिंग में एक डिलीमीटर चरित्र से अलग) जिसे फिर पुन: व्यवस्थित किया जा सकता है। मैं ":" को डिलीमीटर वर्ण के रूप में चुनूंगा (यह grep आउटपुट में फ़ाइल नाम समाप्त होता है, विकल्प-डी ':') और हमें केवल पहला फ़ील्ड देने के लिए कहें (विकल्प-एफ 1, सारणी: केवल फ़ाइल नाम मुद्रित करें, न कि वह भाग जो ":" के बाद आता है), यानीमंच (2) तो

cut -d':' -f1 

होगा और पूरे आदेश आप चाहते थे तो हो जाएगा:

find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -d':' -f1 | xargs -I{} cp -v {} /home/joachim/neu2 

ध्यान दें कि आप यहाँ उदाहरण के लिए सभी आदमी पृष्ठों पा सकते हैं: http://www.linuxmanpages.com

+0

आपको बहुत धन्यवाद !!! आपके उत्तर में इतनी सारी जानकारी है जो वास्तव में मुझे पूरी चीज को बेहतर समझने में मदद करती है। – newandlost

+0

और यह पागल है कि आदेशों को समझने के लिए कितना जानना है। – newandlost

+0

जब आप "... या -exec (फ़ाइल पर दिए गए आदेश को निष्पादित करें, कमांड को"; "के साथ समाप्त किया जाना है ..." क्या आपका वास्तव में मतलब है \ या क्यों वहाँ एक \? – newandlost

0

मैं केवल एक काम का पता लगाया जो नौकरी करता है:

find . -name '*' -exec file {} \; | 
awk '{ 
    if ($3=="image"){ 
     print substr($1, 0, length($1)-1); 
     system("cp " substr($1, 0, length($1)-1) " /home/joachim/neu2") 
    } 
}' 

सबस्ट्र ($ 1, 0, लेन जीएचटी ($ 1) -1) की आवश्यकता है क्योंकि पहली कॉलम फ़ाइल में नाम लौटाता है;

0

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

find . -name \*.jpg | cut -d':' -f1 | xargs -I{} cp --parents -v {} ~/testimage/ 
संबंधित मुद्दे