इसमें शामिल कुछ भी 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
।