एक निर्देशिका में प्रत्येक फ़ाइल के लिए लिनक्स शेल स्क्रिप्ट फ़ाइल नाम को ले लो और एक प्रोग्राम निष्पादित करें


84

परिदृश्य:

लिनक्स सिस्टम में एक फ़ोल्डर। मैं एक फ़ोल्डर में हर .xls फ़ाइल के माध्यम से लूप करना चाहता हूं।

इस फ़ोल्डर में आमतौर पर विभिन्न फ़ोल्डर, विभिन्न फ़ाइलपेट (.sh, .pl, .csv, ...) होते हैं।

मैं केवल इतना करना चाहता हूं कि रूट की सभी फाइलों के माध्यम से लूप है और केवल .xls फाइलों पर एक प्रोग्राम निष्पादित करें।

संपादित करें:

समस्या यह है कि मुझे जो कार्यक्रम निष्पादित करना है, वह 'xls2csv' है जो .xls से .csv प्रारूप में परिवर्तित होता है। इसलिए, प्रत्येक .xls फ़ाइल के लिए मुझे फ़ाइल नाम को पकड़ना होगा और इसे .csv में जोड़ना होगा।

उदाहरण के लिए, मेरे पास एक test.xls फ़ाइल है और तर्क fro xls2csv हैं: xls2csv test.xls test.csv

क्या मुझे समझ में आया?

जवाबों:


199

दे घुमा के:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done

अद्भुत! अच्छी तरह से काम! आपको बहुत - बहुत धन्यवाद!
थिंककोड

6
यह वही है जो मैं पूरी तरह से अलग कारण के लिए देख रहा था। थोड़ा संपादन, और यह मेरी विशिष्ट आवश्यकता के लिए एकदम सही है। धन्यवाद = D और जो कोई भी इस पर स्पष्ट नहीं है, उसके लिए: $ {f%। xls.csv "।
22

Heh I Googled "linux foreach txt file" और यह मिला। यह वही था जो मुझे चाहिए था, मैं वास्तव में xls2csv का उपयोग करने की कोशिश कर रहा था, लेकिन मुझे लगा कि मुझे उस खोज के लिए कोई परिणाम नहीं मिलेगा :)
akiller

1
$ f का मान * .xls होगा यदि * .xls किसी फ़ाइल से मेल नहीं खाता। यदि कोई समस्या है तो मेरे उत्तर की जाँच करें।
एंड्रयूबॉर्ज़ो

या आप केवल nullglobलूप को छोड़ने के लिए सेट कर सकते हैं ।
इग्नासियो वाज़केज़-अब्राम्स

15
for i in *.xls ; do 
  [[ -f "$i" ]] || continue
  xls2csv "$i" "${i%.xls}.csv"
done

doयदि "मिलान" फ़ाइल वास्तव में मौजूद है, तो चेक में पहली पंक्ति है, क्योंकि यदि आपके में कुछ भी मेल नहीं खाता है for, तो do"* .xls" के साथ निष्पादित किया जाएगा $i। यह आपके लिए भयानक हो सकता है xls2csv


13

को देखो खोजने के आदेश।

आप जिस चीज की तलाश कर रहे हैं वह कुछ इस तरह है

find . -name "*.xls" -type f -exec program 

इसे पोस्ट किया

find . -name "*.xls" -type f -exec xls2csv '{}' '{}'.csv;

निष्पादित करेगा xls2csv file.xls file.xls.csv

आप जो चाहते हैं उसके करीब।


find -maxdepth 1सबफ़ोल्डर्स को बाहर करने के लिए। यह भी test.xlsके test.xls.csvबजाय धर्मान्तरित test.csv। तो नहीं काफी ओपी के लिए कहा, लेकिन बहुत करीब है।
ephemient

{}संपूर्ण तर्क के बजाय एक तर्क के विकल्प के रूप में उपयोग करना एक GNU एक्सटेंशन है, जिसके लिए POSIX कल्पना की गारंटी नहीं है find। जैसे, गैर-जीएनयू प्लेटफार्मों के लिए यह उत्तर आवश्यक रूप से पोर्टेबल नहीं है।
चार्ल्स डफी

4
find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash

बैश 4 (पुनरावर्ती)

shopt -s globstar
for xls in /path/**/*.xls
do
  xls2csv "$xls" "${xls%.xls}.csv"
done

उत्कृष्ट समाधान। मैंने इसका उपयोग करने के लिए मुझे haml / scss लिखने और nd.js प्रोजेक्ट के लिए डिज़ाइन-टाइम पर html / css बनाने की अनुमति दी है।
क्रिस केम्प

1
यह एकमुश्त खतरनाक है यदि आप अपने फ़ाइलनाम पर भरोसा नहीं करते हैं, जैसे कि $(rm -rf /)... या सिर्फ व्हाट्सएप।
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.