मैं बैश स्क्रिप्ट में नीचे के समान कमांड चलाने की कोशिश कर रहा हूं। इसे सभी सबफ़ोल्डर्स के माध्यम से खोजना चाहिए $sourcedir
और एक निश्चित प्रकार की सभी फ़ाइलों को रूट स्तर तक कॉपी करना चाहिए $targetdir
।
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
यह बहुत करीब लगता है, सिवाय इसके कि इसमें पास {}
नहीं किया जा रहा $2
है-exec sh -c ...
मैं इसे संभव के रूप में "सही तरीके" के करीब करना चाहूंगा, फिल्नाम में विशेष पात्रों के लिए सहिष्णुता (विशेष रूप से एकल उद्धरण) के साथ।
संपादित करें: मैं देख रहा हूं कि लोग चाइनिंग का उपयोग करने xargs
या तर्क देने का सुझाव दे रहे हैं । मैं इस धारणा के तहत था कि यह सीमित तर्कों के लिए ही ठीक है। यदि मेरे पास है, उदाहरण के लिए, हजारों .jpg फाइलें मैं कई गैलरी निर्देशिकाओं से एक विशाल स्लाइड शो निर्देशिका में कॉपी करने की कोशिश कर रहा हूं, तो क्या समाधान अभी भी काम कर रहे हैं?
संपादित करें 2: मेरी समस्या यह थी कि मैं कमांड _
में शिफ्ट करने के अपने पहले विकल्प से पहले गायब था -exec
। किसी के लिए भी जो इस बात के लिए उत्सुक है कि कमांड कमांड कैसे बनाएं, _
और सब कुछ ठीक हो जाएगा:
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
मैंने नीचे एक उत्तर स्वीकार किया है, क्योंकि यह एक ही कार्य को पूरा करता है, लेकिन अधिक कुशल और सुरुचिपूर्ण है।
xargs
कि नियमित आदेशों पर बड़ी मात्रा में तर्कों को स्वचालित रूप से संभालने के लिए, कभी भी बनाया गया था। यह भी विचार करने के लिए, अधिकांश अधिकतम तर्क सीमाएं, मानक जीएनयू बर्तनों के लिए काफी सुधार की गई हैं। आप उन सभी प्रक्रिया के कांटे से बचते हुए एक प्रदर्शन लाभ देखेंगे, जो हजारों फाइलों पर प्रासंगिक है।