में कोई निश्चित फ़ाइल प्रकार/एक्सटेंशन मौजूद है या नहीं, यह बताएंगे कि किसी विशिष्ट एक्सटेंशन की फ़ाइलें बाश के साथ निर्देशिका में मौजूद हैं या नहीं?जांचें कि निर्देशिका
कुछ
तरहif [ -e *.flac ]; then
echo true;
fi
में कोई निश्चित फ़ाइल प्रकार/एक्सटेंशन मौजूद है या नहीं, यह बताएंगे कि किसी विशिष्ट एक्सटेंशन की फ़ाइलें बाश के साथ निर्देशिका में मौजूद हैं या नहीं?जांचें कि निर्देशिका
कुछ
तरह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
आप carful जो झंडा आप अपने 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
।
(उर्फ' [ ') की शिकायत करता है, तो पैटर्न से अधिक फ़ाइल के लिए विस्तारित:" बाइनरी ऑपरेटर की उम्मीद "या" बहुत सारे तर्क " – msw
@msw - धन्यवाद, मैंने उस मुद्दे को भी नहीं सोचा था। मैंने इसे अपने खाते में लाने के लिए संशोधित करने का प्रयास किया है। – dtlussier
आपको चर को उद्धृत करना चाहिए, यानी '" $ फ़ाइल "का उपयोग करें, क्योंकि फ़ाइल नाम में कुछ खराब वर्ण हो सकते हैं, जैसे रिक्त स्थान या तारांकन। –
#!/bin/bash
files=$(ls /home/somedir/*.flac 2> /dev/null | wc -l)
if [ "$files" != "0" ]
then
echo "Some files exists."
else
echo "No files with that extension."
fi
#/bin/bash
myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then
echo true
else
echo false
fi
shopt -s nullglob
set -- $(echo *.ext)
if [ "${#}" -gt 0 ];then
echo "got file"
fi
बराबर है यह गलत है। सबसे पहले, आप शायद '-gt' के बजाय' -ge' का अर्थ रखते हैं, अन्यथा आपका कोड एकल फ़ाइल का पता नहीं लगाएगा। दूसरा, यदि पैटर्न से मेल खाने वाली कोई भी फाइल नहीं है, तो कोई अनुरूप शेल स्ट्रिंग '* .ext' को छूटेगा, इसलिए आपको अभी भी एक" परिणाम "मिलेगा। –
$ # एक गायक फ़ाइल के लिए 1 है और 0 फाइलों के लिए 0 है। – frayser
बैश केवल:
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
मैं ब्रेसिज़ के बजाय कोष्ठक का उपयोग सुनिश्चित करने के लिए एक subshell प्रयोग किया जाता है (अपने वर्तमान nullglob
सेटिंग पीटना नहीं करना चाहती) ।
shopt -s nullglob
if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ]
then
echo true
fi
यह ls (1) का उपयोग करता है, यदि कोई flac फ़ाइलें मौजूद नहीं है, तो रिपोर्ट त्रुटि और स्क्रिप्ट निकलती है; othewise स्क्रिप्ट जारी है और फ़ाइलों
#! /bin/sh
ls *.flac >/dev/null || exit
## Do something with flac files here
अतिरिक्त चुप्पी के लिए, 2> और 1 को भी रीडायरेक्ट करें। – Jasper
यदि संस्करण: 'if ls * .flac>/dev/null 2> & 1; फिर ... फाई; ' –
संसाधित किया जा सकता है शीर्ष समाधान (if [ -e *.flac ];)
मेरे लिए काम नहीं किया, दे रही है: [: too many arguments
if ls *.flac >/dev/null 2>&1;
तो यह काम करेंगे।
यहां कोई बाहरी आदेश (यानी ls
) का उपयोग करने का समाधान है, लेकिन इसके बजाय एक खोल फ़ंक्शन। बैश में परीक्षण किया गया:
shopt -s nullglob
function have_any() {
[ $# -gt 0 ]
}
if have_any ./*.flac; then
echo true
fi
समारोह have_any
$#
का उपयोग करता है अपने तर्कों गिनती करने के लिए, और [ $# -gt 0 ]
तो परीक्षण कम से कम एक तर्क है कि क्या वहाँ। पर कॉल में की बजाय ./*.flac
का उपयोग पर कॉल में --help
जैसे नामों वाली समस्याओं से बचने के लिए है।
आपको यह देखना होगा कि क्या एक विशिष्ट प्रकार की फ़ाइलों मौजूद -f उपयोग कर सकते हैं: `test` छोड़कर
#!/bin/bash
if [ -f *.flac ] ; then
echo true
fi
आपको ls के आउटपुट का विश्लेषण क्यों नहीं करना चाहिए http://mywiki.wooledge.org/ParsingLs –
अरे थॉमस, केवल एक डाउनवोट के बजाय प्रश्न का बेहतर समाधान जोड़ने के बारे में। – JeremyWeir
इसके अलावा थॉमस, इसका उपयोग क्यों नहीं किया जा रहा है 'ls -l' का उपयोग कर रहा है, मेरा उत्तर' ls -1' – JeremyWeir