आप यह बताने के बारे में कैसे जाएंगे कि क्या किसी निर्देशिका में विशिष्ट एक्सटेंशन की फाइलें बैश के साथ मौजूद हैं?
कुछ इस तरह
if [ -e *.flac ]; then
echo true;
fi
जवाबों:
#!/bin/bash
count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo true
fi
ls -l
, मेरा जवाब उपयोग करता हैls -1
ls -1
प्रति फ़ाइल एक लाइन प्रिंट करने जा रहा है
\n
(और हाँ, जो फ़ाइल नामों में मान्य है)।
#/bin/bash
myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then
echo true
else
echo false
fi
${#myarray[@]}
1
ls -1 *.py
खोजने के बजाय का उपयोग करके भी सरल बना सकता है
यह ls (1) का उपयोग करता है, अगर कोई flac फाइलें मौजूद नहीं हैं, ls रिपोर्ट त्रुटि और स्क्रिप्ट से बाहर निकलता है; othewise स्क्रिप्ट जारी रहती है और फ़ाइलों को संसाधित किया जा सकता है
#! /bin/sh
ls *.flac >/dev/null || exit
## Do something with flac files here
if ls *.flac >/dev/null 2>&1; then ... fi;
shopt -s nullglob
if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ]
then
echo true
fi
आपको सावधान रहना चाहिए कि आप अपने if
बयान में किस झंडे को फेंकते हैं , और यह आपके इच्छित परिणाम से कैसे संबंधित है।
यदि आप केवल नियमित फ़ाइलों और अन्य प्रकार की फ़ाइल सिस्टम प्रविष्टियों की जांच करना चाहते हैं तो आप अपना कोड कंकाल बदलना चाहते हैं:
if [ -f file ]; then
echo true;
fi
के उपयोग -f
को प्रतिबंधित करता है if
नियमित रूप से फ़ाइलों को, जबकि -e
अधिक प्रशस्त है और फाइल सिस्टम प्रविष्टियों के सभी प्रकार से मेल खाएगी। -d
निर्देशिका के लिए निश्चित रूप से अन्य विकल्प हैं , आदि । एक अच्छी लिस्टिंग के लिए http://tldp.org/LDP/abs/html/fto.html देखें ।
जैसा कि @msw द्वारा बताया गया है, test
(अर्थात [
) यदि आप कोशिश करेंगे और एक से अधिक वादों को खिलाएंगे तो वह घुट जाएगा। यदि आपके ग्लोब *.flac
की एक से अधिक फ़ाइल लौटी हैं तो यह आपके मामले में हो सकता है । उस स्थिति में अपने if
परीक्षण को लूप में लपेटने का प्रयास करें :
for file in ./*.pdf
do
if [ -f "${file}" ]; then
echo 'true';
break
fi
done
इस तरह से आप break
चाहते हैं कि आप फ़ाइल एक्सटेंशन के पहले उदाहरण पर हैं और बाकी स्क्रिप्ट के साथ जा सकते हैं।
test
(उर्फ [
) शिकायत करता है कि क्या पैटर्न एक से अधिक फ़ाइल में फैलता है: "बाइनरी ऑपरेटर को उम्मीद है" या "बहुत सारे तर्क"
"$file"
, क्योंकि फ़ाइल नाम में कुछ बुरे वर्ण हो सकते हैं, जैसे रिक्त स्थान या तारांकन।
शीर्ष समाधान (if [ -e *.flac ];)
ने मेरे लिए काम नहीं किया:[: too many arguments
if ls *.flac >/dev/null 2>&1;
तब यह काम करेगा।
आप यह जांचने के लिए -f का उपयोग कर सकते हैं कि क्या एक विशिष्ट प्रकार की फाइलें मौजूद हैं:
#!/bin/bash
if [ -f *.flac ] ; then
echo true
fi
[
(अधिक सामान्य के विपरीत [[
) ग्लोबिंग को रोकता नहीं है।
shopt -s nullglob
set -- $(echo *.ext)
if [ "${#}" -gt 0 ];then
echo "got file"
fi
-ge
इसके बजाय मतलब था -gt
, क्योंकि अन्यथा आपके कोड एकल फ़ाइल का पता नहीं लगाएगा। दूसरा, यदि पैटर्न से मेल खाती हुई कोई फाइल नहीं है, तो कोई भी अनुरूप खोल स्ट्रिंग को *.ext
अछूता छोड़ देगा , इसलिए आपको अभी भी एक "परिणाम" मिलेगा।
केवल बैश:
any_with_ext () (
ext="$1"
any=false
shopt -s nullglob
for f in *."$ext"; do
any=true
break
done
echo $any
)
if $( any_with_ext flac ); then
echo "have some flac"
else
echo "dir is flac-free"
fi
मैं ब्रेसिज़ के बजाय कोष्ठक का उपयोग यह सुनिश्चित करने के लिए करता हूं कि एक उपधारा का उपयोग किया जाता है (अपनी वर्तमान nullglob
सेटिंग को रोकना नहीं चाहते हैं )।
यहां कोई बाहरी कमांड (यानी नहीं ls
) का उपयोग करके एक समाधान है , लेकिन इसके बजाय एक शेल फ़ंक्शन। बैश में परीक्षण किया गया:
shopt -s nullglob
function have_any() {
[ $# -gt 0 ]
}
if have_any ./*.flac; then
echo true
fi
फ़ंक्शन अपने तर्कों को गिनने के लिए have_any
उपयोग करता $#
है, और [ $# -gt 0 ]
फिर परीक्षण करता है कि क्या कम से कम एक तर्क है। कॉल में ./*.flac
सिर्फ के बजाय का उपयोग करने के लिए जैसे नाम के साथ फ़ाइलों के कारण समस्याओं से बचने के *.flac
लिए have_any
है --help
।
पूरा करने के लिए, zsh के साथ:
if [[ -n *.flac(#qN) ]]; then
echo true
fi
यह zsh मैनुअल में सशर्त अभिव्यक्तियों खंड के अंत में सूचीबद्ध है । चूंकि [[
फ़ाइल नाम ग्लोबिंग को अक्षम करता है, हमें (#q)
ग्लोबिंग स्ट्रिंग के अंत में उपयोग करके फ़ाइलनाम पीढ़ी को मजबूर करने की आवश्यकता होती है , फिर उत्पन्न स्ट्रिंग को खाली करने के लिए N
ध्वज ( NULL_GLOB
विकल्प) के मामले में कोई मैच नहीं है।
यहाँ एक काफी सरल उपाय है:
if [ "$(ls -A | grep -i \\.flac\$)" ]; then echo true; fi
जैसा कि आप देख सकते हैं, यह कोड की केवल एक पंक्ति है, लेकिन यह काफी अच्छी तरह से काम करता है। इसे बैश, और डैश जैसे पॉज़िक्स-कंप्लेंट शेल के साथ काम करना चाहिए। यह मामला-असंवेदनशील भी है, और परवाह नहीं करता है कि किस प्रकार की फाइलें (नियमित, सिमलिंक, डायरेक्टरी, आदि) मौजूद हैं, जो आपके लिए कुछ सहानुभूति, या कुछ होने पर उपयोगी हो सकती हैं।
मैंने यह कोशिश की:
if [ -f *.html ]; then
echo "html files exist"
else
echo "html files dont exist"
fi
मैंने अन्य फ़ाइलों के लिए बिना किसी समस्या के इस टुकड़े का उपयोग किया, लेकिन html फ़ाइलों के लिए मुझे एक त्रुटि मिली :
[: too many arguments
मैंने तब @ जेरेमी वियर के काउंट सॉल्यूशन की कोशिश की, जिसने मेरे लिए काम किया।
ध्यान रखें कि यदि आप एक लूप में ऐसा कर रहे हैं तो आपको गणना को रीसेट करना होगा:
count=$((0))
यह किसी भी वहन-योग्य शेल में काम करना चाहिए:
if [ "$(find . -maxdepth 1 -type f | grep -i '.*\.flac$')" ]; then
echo true
fi
यह GNU के साथ भी काम करता है find
, लेकिन IDK अगर यह अन्य कार्यान्वयन के साथ संगत है find
:
if [ "$(find . -maxdepth 1 -type f -iname \*.flac)" ]; then
echo true
fi