निर्देशिकाओं को छोड़कर फ़ाइलों के माध्यम से लूप


11

मुझे किसी भी उप-निर्देशिका को छोड़कर वर्तमान निर्देशिका में प्रत्येक फ़ाइल के लिए कुछ करने के लिए मेरी स्क्रिप्ट की आवश्यकता है।

उदाहरण के लिए, वर्तमान पथ में, 5 फाइलें हैं, लेकिन उनमें से 1 एक फ़ोल्डर (एक उप-निर्देशिका) है। मेरी स्क्रिप्ट को स्क्रिप्ट के रूप में दी गई कमांड को सक्रिय करना चाहिए जब कहा जाए कि स्क्रिप्ट चल रही है। Ie "बैश स्क्रिप्ट wc -w" को वर्तमान निर्देशिका में प्रत्येक फ़ाइल की शब्द गणना देनी चाहिए, लेकिन किसी भी फ़ोल्डर को नहीं, ताकि आउटपुट में कभी भी "/ उप / डायर: एक निर्देशिका" लाइनें न हों।

मेरी वर्तमान स्क्रिप्ट:

#!/bin/bash
dir=`pwd`
for file in $dir/*
do
    $* $file
done

मुझे केवल लूप के लिए निर्देशिकाओं को बाहर करने की आवश्यकता है, लेकिन मुझे नहीं पता कि कैसे।

जवाबों:


11
#!/bin/bash -

for file in "$dir"/*
do
  if [ ! -d "$file" ]; then
      "$@" "$file"
  fi
done

ध्यान दें कि यह उन फ़ाइलों को भी शामिल करता है जो टाइप सीमलिंक की हैं और जहां सीमलिंक टाइप डायरेक्टरी की फाइल को हल करता है (जो कि शायद आप चाहते हैं)।

वैकल्पिक (टिप्पणियों से), केवल फाइलों की जांच करें:

for file in "$dir"/*
do
  if [ -f "$file" ]; then
      "$@" "$file"
  fi
done

@ मर्यादा अच्छा विचार!
लाटक

2
उपयोग करने के लिए बेहतर है if [ -f "$file" ]; then ...। एक निर्देशिका न केवल नियमित फाइल लौटाएगी, बल्कि सॉकेट और सिम्बल भी देगी।
JRFerguson

@JRFerguson ओपी के प्रश्न के आधार पर मैं कहूंगा कि सॉकेट्स और पाइप सहित एक बहुत बुरा विचार होगा। सिमिलिंक के लिए, उन लोगों को ! -dपहले से ही शामिल किया गया है ।
रोज़ा

मैंने अपनी अंतिम स्क्रिप्ट में [-f $ फ़ाइल] का उपयोग किया। यदि स्थिति में उद्धरण चिह्नों की कमी पर ध्यान दें। लगभग हर जगह मैंने देखा कि $ फ़ाइल के आसपास उद्धरण चिह्न थे, फिर भी मुझे अपनी स्क्रिप्ट को काम करने के लिए उन्हें हटाना पड़ा।
तोनिस पिप

3

यहाँ एक पाश का उपयोग करने के लिए एक विकल्प है यदि आपको जो करने की आवश्यकता है वह सरल है (और मुख्य शेल और सी में चर सेट करना शामिल नहीं है)।

आप उपयोग कर सकते हैं findके साथ -execऔर प्रयोग -maxdepth 1उपनिर्देशिका में recursing से बचने के लिए।

[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;

[ -n "$1" ]निर्देशिका में सभी फाइलों को क्रियान्वित स्क्रिप्ट किसी भी तर्क पारित नहीं किया जाता है जब वहाँ से बचना है।


2

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

wc -w *(.)

फ़ाइल नाम के साथ शुरुआत से निपटने के लिए -या ., उपयोग wc -c -- *(.N)या wc -c ./*(.N)। यदि आप प्रतीकात्मक लिंक को नियमित फ़ाइलों के रूप में अच्छी तरह से शामिल करना चाहते हैं, तो इसे बनाएं *(-.)

अन्य आम गोले में ऐसी कोई विशेषता नहीं होती है, इसलिए आपको फ़ाइल द्वारा फ़िल्टर करने के लिए कुछ अलग तंत्र का उपयोग करने की आवश्यकता होती है जैसे कि लूप में फ़ाइल प्रकारों का परीक्षण करना या find


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.