इसमें शामिल कुछ भी lsविशेष वर्ण (अंतरिक्ष और अन्य प्रतीकों) के साथ अप्रत्याशित परिणाम उत्पन्न करने की संभावना है। कोई भी बशीवाद (सरणियों की तरह) पोर्टेबल नहीं है। इसमें शामिल कुछ भी while readआमतौर पर धीमा है।
दूसरी ओर, findबहुत लचीला है (फ़िल्टर करने के लिए बहुत सारे विकल्प), इसमें [कम से कम] दो वाक्यविन्यास हैं जो विशेष वर्णों के लिए सुरक्षित नहीं हैं ... और यह बड़ी निर्देशिका पर अच्छी तरह से मापता है।
इस उदाहरण के लिए, मैंने -inameअपर और लोअर केस एक्सटेंशन नाम दोनों का मिलान किया है। मैंने -maxdepth 1आपके प्रश्न का "वर्तमान निर्देशिका में" सम्मान करने के लिए भी प्रतिबंधित किया है। लाइनों की संख्या की गिनती करने के बजाय, जहां फ़ाइलनाम में CR / LF शामिल हो सकते हैं, -print0प्रत्येक फ़ाइल नाम के अंत में एक NULL बाइट प्रिंट करेंगे ... इसलिए | tr -d -c "\000" | wc -lसटीक रूप से फ़ाइलों (NULL बाइट्स!) की गिनती कर रहा है।
extensions="jpg png gif"
for ext in $extensions; do
c=$(find . -maxdepth 1 -iname "*.$ext" -print0 | tr -d -c "\000" | wc -c)
if [ $c -gt 0 ]; then
echo "Found $c *.$ext files"
find . -maxdepth 1 -iname "*.$ext" -print0 | xargs -0 -r -n1 DOSOMETHINGHERE
# or # find . -maxdepth 1 -iname "*.$ext" -exec "ls" "-l" "{}" ";"
fi
done
पीएस के -print0 | tr -d -c "\000" | wc -cसाथ बदला जा सकता है-printf "\000" | wc -c या यहां तक कि-printf '\n' | wc -l ।