फ़ाइलों की संख्या गिनने के लिए स्क्रिप्ट को बैश करें


11

मेरे पास एक स्क्रिप्ट है और मैं विभिन्न संदेशों को प्रदर्शित करना चाहता हूं यदि कोई फ़ाइल मौजूद है या नहीं। मेरे पास एक स्क्रिप्ट है जैसे:

count=ls /import/*.zip | wc -l

echo "Number of files: " $count
if [ "$count" > "0" ]; then
    echo "Import $count files"
else
    echo "**** No files found ****"
fi

हालाँकि, यदि कोई फ़ाइल मौजूद नहीं है, तो यह No such file or directory0 फ़ाइलों के बजाय दिखाई दे रही है। निर्देशिका में एक /import/निर्देशिका है, इसलिए मैं सिर्फ एक lsकमांड नहीं कर सकता क्योंकि यह हमेशा 0 से अधिक मूल्य लौटाएगा।

मैं किसी विशिष्ट एक्सटेंशन (.zip, .gz, इत्यादि) की फ़ाइलों की संख्या कैसे गिन सकता हूं और दोनों फ़ाइलों की संख्या प्रदर्शित करने के लिए एक बैश स्क्रिप्ट में उस मान का उपयोग कर सकता हूं और फिर अलग-अलग संदेशों को प्रदर्शित करने के लिए एक स्टेटमेंट में इसका उपयोग कर सकता हूं?

जवाबों:


15

count=$(find /import -maxdepth 1 -name '*.zip' | wc -l)


1
मैंने वर्तमान निर्देशिका में केवल फाइलों की गिनती करने के लिए -मैक्सडीप 1 को जोड़ा
वैलेस शॉन

1
आप संभवत: '* .zip' को उद्धृत करना चाहते हैं यदि वर्तमान निर्देशिका में कोई .zip फाइलें हैं, जब यह लागू किया जाता है, तो उस स्थिति में शेल ने आपके लिए * .zip का विस्तार किया होगा, जबकि आप चाहते हैं कि इसे खोजने के लिए गुजरें। (1)।
फिल पी

4

इसके साथ प्रयास करें:

count=$(find /import/ -maxdepth 1 -type f -name '*.zip' | wc -l)
...
if [ $count -gt 0 ] ; then
  ...
else
  ...
fi

यह विचार "ऐसी कोई फ़ाइल नहीं" त्रुटि को छिपाने के लिए है जो बिटबकैट को भेजकर STDERR को मुद्रित करता है, और संख्याओं की तुलना करने के लिए उचित परीक्षण फ़ंक्शन का उपयोग करता है। ( -gt"इससे अधिक" के लिए खड़ा है। यह भी नहीं है -eq, -lt, -ge, आदि)


एक विकल्प के रूप में, आप यह भी कर सकते हैंcount=$(find /import -type f -name "*.zip" | wc -l)
slillibri

यकीन है, लेकिन इसका एक अलग अर्थ है कि ls /import/*.zipअगर उपनिर्देशिकाएँ हैं
Mat

मैंने उपनिर्देशिकाओं में गिनती फाइलों से बचने के लिए मैक्सडेप सेट किया और स्क्रिप्ट का उपयोग करने के लिए -gt को अद्यतन किया। मदद के लिए धन्यवाद
वालेस सीन

यह विफल रहता है अगर ls मंगलाचरण के लिए argv में फिट होने के लिए निर्देशिका में बहुत सारी फाइलें हैं।
फिल पी

ओह सही। एक findसंस्करण के साथ ठीक किया गया ।
Mat

0

मैंने आपकी स्क्रिप्ट की कोशिश की और, जैसा कि अपेक्षित था, जब कोई फाइल मेल नहीं खाती है तो आउटपुट में 0 फाइलें दिखाती है, लेकिन त्रुटि भी पहले ही दिखा देती है ls। इसे हल करना काफी आसान है, इसमें खाई की जरूरत नहीं है ls। बस इसके साथ पहली पंक्ति बदलें:

count=$(ls /import/*.zip 2>/dev/null| wc -l)

2>/dev/null/dev/nullत्रुटि संदेश को दबाने के लिए stderr को पुनर्निर्देशित करता है ।

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