मैं कई फाइलों पर कमांड कैसे चला सकता हूं


13

यह काफी बुनियादी है, मेरे पास जेएस फ़ाइलों के कई सबफ़ोल्डर्स के साथ एक फ़ोल्डर है और मैं उन फ़ोल्डरों में सभी फाइलों पर Google के क्लोजर कंपाइलर को चलाना चाहता हूं। किसी एकल फ़ाइल को संसाधित करने का आदेश निम्नानुसार है:

java -jar compiler.jar --js filename.js --js_output_file newfilename.js

अपनी निर्देशिका संरचना में प्रत्येक JS फ़ाइल पर चलने के लिए मैं इसे कैसे संशोधित करूं?

जवाबों:


14

आप उपयोग कर सकते हैं find:

find . -name "*.js" -exec java -jar compiler.jar --js {} --js_output_file new{} \;

धन्यवाद, और मैं शायद इसका लाभ उठाने के लिए सब कुछ बदल सकता हूं क्योंकि मूल JS फ़ाइलों को ओवरराइट करने की आवश्यकता है
Mataniko

यदि --js और --js_output_file को अलग करने की आवश्यकता होती है, तो मैं एक दो-लाइन स्क्रिप्ट बनाऊंगा जो फ़ाइल नाम को एक पैरामीटर के रूप में लेता है, अस्थायी फ़ाइल और mvमूल नाम के लिए फ़ाइल लिखता है ।
एंथन

यदि आप एक अलग स्क्रिप्ट बनाने से बचना चाहते हैं find -name '*.js' | while read jsfile; do java -jar compiler.jar --js "$jsfile" --js_output_file "new$jsfile" && mv "new$jsfile" "$jsfile"; doneतो यह ट्रिक करना चाहिए।
डेविड बैगरमैन

find -execसरल आदेशों के लिए महान है। जटिल लोगों के find | xargsलिए बेहतर है और यह समानांतर में कमांड चलाने की भी अनुमति देता है।
भीड़

@ आरुष शायद समझाएं कि xargsबेहतर क्यों है?
मेल बॉयज़

7

आप एक साधारण forलूप का उपयोग भी कर सकते हैं , खासकर यदि फाइलें एक एकल निर्देशिका (कोई उपनिर्देशिका) के भीतर हैं। इसे उपनिर्देशिकाओं के साथ भी काम करने के लिए संशोधित किया जा सकता है।

पुनरावृत्ति के बिना:

for filename in ./*.js
do
    java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done

या समतुल्य एक-लाइनर के रूप में:

for filename in ./*.js; do java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"; done

उपनिर्देशिकाओं में पुनर्खरीद करने के लिए (जीएनयू को 4.0 या नए की आवश्यकता है) (धन्यवाद @ क्रिसडाउन ):

shopt -s globstar
for filename in ./**/*.js; do
    java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done

1
यह उपनिर्देशिका की पुनरावृत्ति नहीं करता है जैसा कि प्रश्न में पूछा गया है। Bash4 + के साथ, आप ऐसा करने के globstarलिए उपयोग कर सकते हैं ।
क्रिस डाउन

1
हां, यह एक अच्छा जवाब है और यह जानना बहुत अच्छा है, लेकिन दूसरा जवाब वही करता है जो मुझे इसकी आवश्यकता है।
मटानिको

1
ओह, मैं पूरी तरह से "कई सबफ़ोल्डर्स" भाग को याद करने में कामयाब रहा। माफ़ करना। उत्तर को पूर्णता की खातिर इधर-उधर छोड़ना, हालाँकि।
एक CVn

3
@rush चूंकि **पुनरावृत्ति के एक अनियंत्रित स्तर से मेल खा सकता है, **/*.jsकाम करता है: sprunge.us/PXQK
क्रिस डाउन

1
यह आम तौर पर उपयोग करने के लिए for f in ./*.js; doया for f in ./**/*.js; doखुद को फिल्नाम से शुरू होने से बचाने के लिए एक अच्छा विचार है -(मुझे नहीं पता कि इस मामले में यह आवश्यक है, लेकिन वैसे भी यह एक अच्छी आदत है)।
evilsoup
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.