2010-10-04 13 views
47

में कोई निश्चित फ़ाइल प्रकार/एक्सटेंशन मौजूद है या नहीं, यह बताएंगे कि किसी विशिष्ट एक्सटेंशन की फ़ाइलें बाश के साथ निर्देशिका में मौजूद हैं या नहीं?जांचें कि निर्देशिका

कुछ

तरह
if [ -e *.flac ]; then 
echo true; 
fi 

उत्तर

58
#!/bin/bash 

count=`ls -1 *.flac 2>/dev/null | wc -l` 
if [ $count != 0 ] 
then 
echo true 
fi 
+0

आपको ls के आउटपुट का विश्लेषण क्यों नहीं करना चाहिए http://mywiki.wooledge.org/ParsingLs –

+3

अरे थॉमस, केवल एक डाउनवोट के बजाय प्रश्न का बेहतर समाधान जोड़ने के बारे में। – JeremyWeir

+3

इसके अलावा थॉमस, इसका उपयोग क्यों नहीं किया जा रहा है 'ls -l' का उपयोग कर रहा है, मेरा उत्तर' ls -1' – JeremyWeir

2

आप 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

+1

(उर्फ' [ ') की शिकायत करता है, तो पैटर्न से अधिक फ़ाइल के लिए विस्तारित:" बाइनरी ऑपरेटर की उम्मीद "या" बहुत सारे तर्क " – msw

+1

@msw - धन्यवाद, मैंने उस मुद्दे को भी नहीं सोचा था। मैंने इसे अपने खाते में लाने के लिए संशोधित करने का प्रयास किया है। – dtlussier

+0

आपको चर को उद्धृत करना चाहिए, यानी '" $ फ़ाइल "का उपयोग करें, क्योंकि फ़ाइल नाम में कुछ खराब वर्ण हो सकते हैं, जैसे रिक्त स्थान या तारांकन। –

2
#!/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 
10
#/bin/bash 

myarray=(`find ./ -maxdepth 1 -name "*.py"`) 
if [ ${#myarray[@]} -gt 0 ]; then 
    echo true 
else 
    echo false 
fi 
+4

यह एक अच्छा है क्योंकि आप वास्तव में फ़ाइलों को ढूंढने के बाद कुछ * कर सकते हैं। – ephsmith

+0

+1 को रैपिंग सबशेल चलाने के लिए +1 को एक सरणी चर बनाने के लिए कोष्ठक में ढूंढें। अन्यथा, अगर रिटर्न मिलता है तो कोई परिणाम नहीं होता है '$ {# myarray [@]} '1 – shaffooo

2
shopt -s nullglob 
    set -- $(echo *.ext) 
    if [ "${#}" -gt 0 ];then 
     echo "got file" 
    fi 
+0

बराबर है यह गलत है। सबसे पहले, आप शायद '-gt' के बजाय' -ge' का अर्थ रखते हैं, अन्यथा आपका कोड एकल फ़ाइल का पता नहीं लगाएगा। दूसरा, यदि पैटर्न से मेल खाने वाली कोई भी फाइल नहीं है, तो कोई अनुरूप शेल स्ट्रिंग '* .ext' को छूटेगा, इसलिए आपको अभी भी एक" परिणाम "मिलेगा। –

+0

$ # एक गायक फ़ाइल के लिए 1 है और 0 फाइलों के लिए 0 है। – frayser

1

बैश केवल:

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 सेटिंग पीटना नहीं करना चाहती) ।

7
shopt -s nullglob 
if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ] 
then 
    echo true 
fi 
8

यह ls (1) का उपयोग करता है, यदि कोई flac फ़ाइलें मौजूद नहीं है, तो रिपोर्ट त्रुटि और स्क्रिप्ट निकलती है; othewise स्क्रिप्ट जारी है और फ़ाइलों

#! /bin/sh 
ls *.flac >/dev/null || exit 
## Do something with flac files here 
+2

अतिरिक्त चुप्पी के लिए, 2> और 1 को भी रीडायरेक्ट करें। – Jasper

+1

यदि संस्करण: 'if ls * .flac>/dev/null 2> & 1; फिर ... फाई; ' –

2

संसाधित किया जा सकता है शीर्ष समाधान (if [ -e *.flac ];) मेरे लिए काम नहीं किया, दे रही है: [: too many arguments

if ls *.flac >/dev/null 2>&1; तो यह काम करेंगे।

0

यहां कोई बाहरी आदेश (यानी ls) का उपयोग करने का समाधान है, लेकिन इसके बजाय एक खोल फ़ंक्शन। बैश में परीक्षण किया गया:

shopt -s nullglob 
function have_any() { 
    [ $# -gt 0 ] 
} 

if have_any ./*.flac; then 
    echo true 
fi 

समारोह have_any$# का उपयोग करता है अपने तर्कों गिनती करने के लिए, और [ $# -gt 0 ] तो परीक्षण कम से कम एक तर्क है कि क्या वहाँ। पर कॉल में की बजाय ./*.flac का उपयोग पर कॉल में --help जैसे नामों वाली समस्याओं से बचने के लिए है।

0

आपको यह देखना होगा कि क्या एक विशिष्ट प्रकार की फ़ाइलों मौजूद -f उपयोग कर सकते हैं: `test` छोड़कर

#!/bin/bash 

if [ -f *.flac ] ; then 
    echo true 
fi 
संबंधित मुद्दे