यदि कोई निर्देशिका बैश शेल स्क्रिप्ट में मौजूद है तो मैं कैसे जांच सकता हूं?


3719

बैश शेल स्क्रिप्ट के भीतर कोई डायरेक्टरी मौजूद है या नहीं, यह जांचने के लिए किस कमांड का उपयोग किया जा सकता है?

जवाबों:


5144

यह जाँचने के लिए कि क्या कोई निर्देशिका शेल स्क्रिप्ट में मौजूद है, आप निम्न का उपयोग कर सकते हैं:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

या जाँच करने के लिए कि क्या कोई निर्देशिका मौजूद नहीं है:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

हालांकि, जैसा कि जॉनसन बताते हैं, बाद के आदेशों के अनुसार काम नहीं कर सकते हैं यदि आप इस बात पर ध्यान नहीं देते हैं कि एक निर्देशिका का प्रतीकात्मक लिंक भी इस चेक को पास करेगा। जैसे यह चल रहा है:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

त्रुटि संदेश देगा:

rmdir: failed to remove `symlink': Not a directory

यदि सांकेतिक आदेश निर्देशिकाओं की अपेक्षा करते हैं, तो प्रतीकात्मक लिंक को अलग तरह से व्यवहार करना पड़ सकता है:

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi

चर को लपेटने के लिए उपयोग किए जाने वाले दोहरे उद्धरणों का विशेष ध्यान रखें। इसका कारण एक अन्य उत्तर में 8jean द्वारा समझाया गया है ।

यदि चर में स्थान या अन्य असामान्य वर्ण होते हैं तो यह संभवतः स्क्रिप्ट को विफल कर देगा।


29
यदि आप इसे GNU टूल्स के साथ सुरक्षित खेलना चाहते हैं, --तो अत्यधिक अनुशंसित (एंड-ऑफ़-ऑप्शंस मार्कर) का उपयोग किया जाता है। अन्यथा, यदि आपके चर में कुछ ऐसा है जो एक विकल्प की तरह दिखता है, तो स्क्रिप्ट रिक्त स्थान के साथ विफल हो जाएगी।
मार्क मुत्ज़ - mmutz

2
बाश, ksh, आदि के आधुनिक संस्करणों के लिए [...]
बिल्टिन है

79
ध्यान में रखने की एक बात: [ ! -d "$DIRECTORY" ]सच या तो करता है, तो हो सकता है $DIRECTORYमौजूद नहीं है, या यदि करता है मौजूद हैं, लेकिन एक निर्देशिका नहीं है। कुछ इस तरह से विचार करें if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi; यदि "$DIRECTORY"फ़ाइल है तो यह विफल हो जाएगी । (निश्चित रूप से आपको जांचना चाहिए कि क्या mkdirवैसे भी सफल हुआ? कई कारण हैं जो इसे विफल कर सकते हैं।)
कीथ थॉम्पसन

5
यह उल्लेखनीय है कि जैसे ही चेक का प्रदर्शन किया गया है, स्थिति अन्य प्रक्रियाओं के कारण पहले से ही बदल सकती है। कई मामलों में केवल निर्देशिका बनाना या उपयोग करना बेहतर होता है और विफलता पर प्रतिक्रिया होती है।
अल्फ सिप

12
निर्देशिका ( -d) और सिम्लिंक ( -L) दोनों के लिए परीक्षण के बजाय , चर की तरह स्लैश को जोड़ना आसान है if [ -d "${THING:+$THING/}" ]। एक निर्देशिका अतिरिक्त स्लैश को बुरा नहीं मानेगी। एक फ़ाइल झूठी का मूल्यांकन करेगी। खाली तो खाली रहेगा, असत्य है। और एक सीलिंक को उसके गंतव्य के लिए हल किया जाएगा। बेशक, यह आपके लक्ष्य पर निर्भर करता है। अगर आप वहां जाना चाहते हैं , तो यह ठीक है। यदि आप इसे हटाना चाहते हैं , तो इस उत्तर में कोड बेहतर है।
घटिया

530

बैश स्क्रिप्ट में उन्हें संदर्भित करते समय हमेशा दोहरे उद्धरण चिह्नों को लपेटने के लिए याद रखें। बच्चे इन दिनों इस विचार के साथ बड़े होते हैं कि उनके निर्देशिका नामों में रिक्त स्थान और बहुत सारे अन्य मजेदार चरित्र हो सकते हैं। (रिक्त स्थान! मेरे दिनों में वापस, हमारे पास कोई फैंसी स्थान नहीं था!))

एक दिन, उन बच्चों में से एक $DIRECTORYसेट के साथ आपकी स्क्रिप्ट चलाएगा "My M0viez"और आपकी स्क्रिप्ट उड़ जाएगी। आप ऐसा नहीं चाहते। तो इस का उपयोग करें।

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

9
दोहरे उद्धरण चिह्नों का उपयोग करने का एक और कारण यह है कि $ DIRECTORY किसी कारण से सेट नहीं है।
जॉन Ericson

2
"हमेशा दोहरे उद्धरण चिह्नों में लपेटें ... बैश स्क्रिप्ट में।" बाश के लिए, [[...]] का उपयोग करते समय तकनीकी रूप से आवश्यक नहीं; देख tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS (ध्यान दें: कोई शब्द बंटवारे): "कोई फ़ाइल नाम विस्तार या शब्द बंटवारे [[और]] के बीच जगह लेता है, लेकिन वहाँ पैरामीटर विस्तार और आदेश प्रतिस्थापन है।"
माइकल

2
यूनिक्स / लिनक्स पर निर्देशिकाओं में कोई व्हाट्सएप नहीं होना चाहिए, और बाद में स्क्रिप्ट को इसके अनुकूल नहीं होना चाहिए। यह काफी बुरा है विंडोज विंडोज स्क्रिप्टिंग के सभी परिणामों के साथ, विंडोज इसका समर्थन करता है, लेकिन कृपया, जो भी हो, प्यार के लिए, अनावश्यक आवश्यकताओं को पेश करने की आवश्यकता नहीं है।
TVCa

18
@tvCa मुझे लगता है कि आमतौर पर उपयोगकर्ता डेवलपर्स के लिए चीजों को आसान बनाने के लिए मजबूर होने के बजाय अपने निर्देशिका नामों में अधिक लचीलेपन की अनुमति देना पसंद करते हैं। (वास्तव में, लंबे फ़ाइल नामों के साथ काम करते समय, मैं रिक्त स्थान के बिना लोगों को एक दर्द के रूप में पाता हूं, क्योंकि शब्द स्वयं को मारता है, भले ही मैं खुद अतीत में स्क्रिप्ट और कार्यक्रमों में रिक्त स्थान के लिए पथों का लेखा न होने से पीड़ित हूं।)
JAB

2
हा। रिक्त स्थान केवल ऐसे अक्षर हैं जिनका कोई ग्लिफ़ नहीं होता है। वैसे भी, आप उन्हें बैकस्लैश से बचा सकते हैं।
27चुगुका

228

नोट -d परीक्षण कुछ आश्चर्यजनक परिणाम दे सकता है:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

के तहत फ़ाइल: "जब एक निर्देशिका एक निर्देशिका नहीं है?" जवाब: "जब यह एक निर्देशिका के लिए एक सहिष्णुता है।" थोड़ा और गहन परीक्षण:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

आप पर बैश के मैनुअल में अधिक जानकारी मिल सकती बैश सशर्त भाव और [निर्मित आदेश और [[यौगिक commmand


12
या, यह मानते हुए कि केवल निर्देशिकाओं पर काम करना आवश्यक है (और लिंक को अनदेखा किया जा सकता है) => if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi... या, एक कमांड के लिए जो दोनों लिंक और dirs पर काम करता है:rm -r tmpdir
michael

218

मुझे लगता है कि डबल-ब्रैकेट संस्करण testलॉजिक टेस्ट को अधिक स्वाभाविक बनाता है:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

क्योंकि if [[ -d "$TARFILE" ]]मैं [[: नहीं मिला
TheVillageIdiot

15
@ TheVillageIdiot और @ हेजहोग, क्या आप बैश शेल का उपयोग कर रहे हैं? डबल ब्रैकेट सार्वभौमिक रूप से समर्थित नहीं है। यहाँ उस बिंदु पर एक SO उत्तर दिया गया है: stackoverflow.com/questions/669452/…
yukondude

6
और डिफ़ॉल्ट संकलन विकल्पों के साथ बिजीबॉक्स ऐश [[ ]]में समर्थित है, लेकिन वास्तव में करने के लिए कोई अलग कार्यक्षमता प्रदान नहीं करता है [ ]। यदि पोर्टेबिलिटी एक चिंता है, [ ]तो आवश्यक वर्कअराउंड के साथ रहें और उपयोग करें।
डबियसजिम

6
... यदि शेल स्क्रिप्ट में बैश कंस्ट्रक्शन का उपयोग किया जाता है, तो स्क्रिप्ट की पहली लाइन होनी चाहिए: #! / bin / bash (और नहीं #! / bin / sh, ksh, आदि)
michael

बैश में डबल वर्ग ब्रैकेट का उपयोग करते समय, आपको चर को उद्धृत करने की आवश्यकता नहीं होती है।
ह्यूबर्ट ग्रेज्सकोविआक

157

छोटा रूप:

[ -d "$DIR" ] && echo "Yes"

6
क्या यह इस तरह काम करता है if $dir is a dir, then echo "yes":? स्पष्टीकरण का एक सा मदद करेगा :)
मार्टिग्न

5
cmd && otherके लिए एक सामान्य आशुलिपि है if cmd; then other; fi- यह अधिकांश प्रोग्रामिंग भाषाओं के साथ काम करता है जो बूलियन तर्क का समर्थन करते हैं, और शॉर्ट-सर्किट मूल्यांकन के रूप में जाना जाता है ।
ट्रिपलए

1
व्यवहार समान नहीं है set -e(जो एक शेल प्रोग्रामिंग सबसे अच्छा अभ्यास है )।
dolmen

1
@ डॉल्मेन की [ -d "$DIR" ]जाँच की जाती है (उसके बाद && echo Yes), इसलिए मेरा मानना set -eहै कि स्क्रिप्ट के व्यवहार पर कोई फर्क नहीं पड़ता (अर्थात यदि परीक्षण विफल हो जाता है, तो स्क्रिप्ट सामान्य रूप से जारी रहती है)।
16

132

यह देखने के लिए कि क्या कोई निर्देशिका मौजूद है, आप ifइस तरह की एक सरल संरचना का उपयोग कर सकते हैं :

if [ -d directory/path to a directory ] ; then
# Things to do

else #if needed #also: elif [new condition]
# Things to do
fi

आप इसे नकारात्मक में भी कर सकते हैं:

if [ ! -d directory/path to a directory ] ; then
# Things to do when not an existing directory

नोट : सावधान रहें। ब्रेसिज़ खोलने और बंद करने दोनों के दोनों तरफ खाली स्थान छोड़ें।

एक ही वाक्यविन्यास के साथ आप उपयोग कर सकते हैं:

-e: any kind of archive

-f: file

-h: symbolic link

-r: readable file

-w: writable file

-x: executable file

-s: file size greater than zero

फ़ाइल स्विच के साथ ऑफ़-टॉपिक से अलग हटकर, यह 2008 के स्वीकृत उत्तर से बेहतर कैसे है?
दान डेस्केल्सस्कु

बेहतर है, क्योंकि [! -d निर्देशिका / एक निर्देशिका के लिए रास्ता]
user1855805

108
  1. एक निर्देशिका या फ़ाइल मौजूद है या नहीं, यह जांचने के लिए एक सरल स्क्रिप्ट:

    if [ -d /home/ram/dir ]   # For file "if [-f /home/rama/file]"
    then
        echo "dir present"
    else
        echo "dir not present"
    fi
  2. एक साधारण स्क्रिप्ट यह जाँचने के लिए कि निर्देशिका मौजूद है या नहीं:

    mkdir tempdir   # If you want to check file use touch instead of mkdir
    ret=$?
    if [ "$ret" == "0" ]
    then
        echo "dir present"
    else
        echo "dir not present"
    fi

    उपरोक्त स्क्रिप्ट यह जाँच करेगी कि निर्देशिका मौजूद है या नहीं

    $? यदि अंतिम कमांड एक सफलता है तो यह "0" देता है, और गैर-शून्य मान। मान लीजिए tempdirकि पहले से मौजूद है। फिर mkdir tempdirनीचे की तरह एक त्रुटि देगा:

    mkdir: निर्देशिका 'tempdir' नहीं बना सकता है: फ़ाइल मौजूद है


4
अगर यह पहले से मौजूद नहीं था, तो दूसरा व्यक्ति डायरेक्टरी बनाएगा। फिर यह बेकार नहीं है।
शिह झांग

👆👆👆। दूसरा खतरनाक लगता है। चूंकि यह निर्देशिका बनाता है, इसलिए यह अब भी सच नहीं है कि डायर मौजूद नहीं है।
क्रिस

92

आप test -d(देखें man test) का उपयोग कर सकते हैं ।

-d file यदि फ़ाइल मौजूद है तो सच है और एक निर्देशिका है।

उदाहरण के लिए:

test -d "/etc" && echo Exists || echo Does not exist

नोट: testकमांड सशर्त अभिव्यक्ति के समान है [(देखें man [:), इसलिए यह शेल स्क्रिप्ट्स में पोर्टेबल है।

[- यह बिलिन के लिए एक पर्याय है test, लेकिन अंतिम तर्क को ]उद्घाटन से मेल खाना चाहिए [

संभावित विकल्पों या आगे की मदद के लिए, देखें:

  • help [
  • help test
  • man test या man [

55

या कुछ पूरी तरह से बेकार के लिए:

[ -d . ] || echo "No"

6
यह कभी नहीं "नहीं" मुद्रित करेगा। वर्तमान निर्देशिका हमेशा मौजूद रहती है, जब तक कि किसी अन्य धागे या अन्य तरीकों से हटाई नहीं जाती।
जाहिद

बिल्कुल सही नमूना :) यह देखते हुए कि स्वीकार किए गए उत्तर की तुलना में "अद्वितीय" कुछ उत्तर कैसे हैं
सर्गेई सरगसियन

4
इसे इतनी बार क्यों उखाड़ा गया है? यह सवाल का जवाब नहीं है।
कोडरफ़र

बेसिक आईटी बेस्ट द बेस्ट ईवा
कार्ल मॉरिसन

52

यहाँ बहुत ही व्यावहारिक मुहावरा है:

(cd $dir) || return # Is this a directory,
                    # and do we have access?

मैं आमतौर पर इसे एक फंक्शन में लपेटता हूं:

can_use_as_dir() {
    (cd ${1:?pathname expected}) || return
}

या:

assert_dir_access() {
    (cd ${1:?pathname expected}) || exit
}

इस दृष्टिकोण के बारे में अच्छी बात यह है कि मुझे एक अच्छे त्रुटि संदेश के बारे में नहीं सोचना है।

cdमुझे पहले से ही मानक त्रुटि के लिए एक मानक संदेश भेज देगा। यह मेरे द्वारा प्रदान की जाने वाली जानकारी से अधिक जानकारी भी देगा। cdएक सबस्क्रिप्शन के अंदर प्रदर्शन करने ( ... )से कमांड कॉलर की वर्तमान निर्देशिका को प्रभावित नहीं करता है। यदि निर्देशिका मौजूद है, तो यह सबशेल और फ़ंक्शन केवल एक सेशन नहीं है।

अगला तर्क यह है कि हम करने के लिए पारित है cd: ${1:?pathname expected}। यह पैरामीटर प्रतिस्थापन का एक अधिक विस्तृत रूप है जिसे नीचे अधिक विस्तार से समझाया गया है।

Tl; dr: यदि इस फ़ंक्शन में पास किया गया स्ट्रिंग खाली है, तो हम फिर से सबस्क्रिप्शन से बाहर निकल जाते हैं ( ... )और दिए गए त्रुटि संदेश के साथ फ़ंक्शन से वापस आ जाते हैं।


ksh93आदमी पृष्ठ से उद्धरण :

${parameter:?word}

यदि parameter सेट किया गया है और गैर-अशक्त है, तो उसके मूल्य को प्रतिस्थापित करें; अन्यथा, wordखोल और प्रिंट से बाहर निकलें (यदि संवादात्मक नहीं है)। यदि wordछोड़ा गया है तो एक मानक संदेश मुद्रित होता है।

तथा

यदि :उपर्युक्त अभिव्यक्तियों में से बृहदान्त्र को छोड़ दिया जाता है, तो शेल केवल जांचता है कि पैरामीटर सेट है या नहीं।

यहाँ पर हेडलाइटिंग शेल डॉक्यूमेंटेशन में अजीबोगरीब है, जैसा कि wordव्हॉट्सएप सहित किसी भी उचित स्ट्रिंग को संदर्भित कर सकता है।

इस विशेष मामले में, मुझे पता है कि मानक त्रुटि संदेश 1: parameter not setपर्याप्त नहीं है, इसलिए मैं उस मूल्य के प्रकार पर ज़ूम करता हूं जिसकी हम यहां उम्मीद करते हैं - pathnameएक निर्देशिका की।

एक दार्शनिक नोट:

शेल ऑब्जेक्ट ओरिएंटेड भाषा नहीं है, इसलिए संदेश कहता है pathname, नहीं directory। इस स्तर पर, मैं इसे सरल रखना चाहता हूं - एक फ़ंक्शन के तर्क बस तार हैं।


यह केवल अस्तित्व के लिए जाँच से अधिक है: यह आपके उपयोगकर्ता स्तर पर पहुँच क्षमता के लिए जाँच करता है। एसओ प्रश्न केवल अस्तित्व के लिए खड़े हैं । तो सही उत्तर के test -dरूप में @Grundlefleck समझाया गया है।
एफ। हौरी

7
@ F.Hauri - उन्होंने और कुछ नहीं मांगा, यह सच है। हालाँकि, मैंने पाया है कि मुझे आमतौर पर इससे अधिक जानने की जरूरत है।
हेंक लैंगवेल्ड

और यह मेरे लिए कभी नहीं हुआ कि कोई भी परीक्षा निर्णायक नहीं हो सकती, जब तक कि वह जड़ के रूप में नहीं चलती। test -d /unreadable/existsविफल होगा, भले ही तर्क मौजूद हो।
हेंक लैंगवेल्ड

36
if [ -d "$Directory" -a -w "$Directory" ]
then
    #Statements
fi

उपरोक्त कोड यह जाँचता है कि क्या निर्देशिका मौजूद है और यदि यह उपयुक्त है।


1
-a, -e के प्रभाव में समान है। यह "पदावनत" कर दिया गया है, और इसका उपयोग हतोत्साहित किया जाता है।
कज़िन कोकीन

27
DIRECTORY=/tmp

if [ -d "$DIRECTORY" ]; then
    echo "Exists"
fi

ऑनलाइन कोशिश करें


के spaceबाद रीमाइबर [-> [``-डी । मुझे लापता स्थान के कारण त्रुटि मिली
राज

4
फिर से , यह जवाब पहले से ही 2008 में दिया गया था, अधिक उपयोगी स्पष्टीकरण के साथ। यहां एकमात्र नई चीज ऑनलाइन खेल का मैदान है।
Dan Dascalescu

24

यह कोड बैश प्रॉम्प्ट पर टाइप करें:

if [ -d "$DIRECTORY" ]; then
    # If true this block of code will execute
fi

फिर , यह जवाब पहले से ही 2008 में दिया गया था। इसे दोहराने में क्या बात है ?!
Dan Dascalescu

21

अधिक सुविधाओं का उपयोग find

  • उप-निर्देशिका में फ़ोल्डर के अस्तित्व की जाँच करें:

    found=`find -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where "myDirectory" is.
        # It may contain several lines if there are several folders named "myDirectory".
    fi
  • वर्तमान निर्देशिका में एक पैटर्न के आधार पर एक या कई फ़ोल्डरों के अस्तित्व की जाँच करें:

    found=`find -maxdepth 1 -type d -name "my*"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where folders "my*" have been found.
    fi
  • दोनों का संयोजन। निम्नलिखित उदाहरण में, यह वर्तमान निर्देशिका में फ़ोल्डर के अस्तित्व की जांच करता है:

    found=`find -maxdepth 1 -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' is not empty => "myDirectory"` exists.
    fi

हाय निएल। आपका विचार की तरह एक पैटर्न के आधार पर निर्देशिका के अस्तित्व की जाँच के लिए उपयोगी हो सकता है: find -maxdepth 1 -type d -name 'pattern'। क्या आपको बुरा लगता है अगर मैं आपके उत्तर में इस चाल को जोड़ दूं? चीयर्स;)
ओलिविएरे नोव

20

वास्तव में, आपको बुलेटप्रूफ दृष्टिकोण प्राप्त करने के लिए कई उपकरणों का उपयोग करना चाहिए:

DIR_PATH=`readlink -f "${the_stuff_you_test}"` # Get rid of symlinks and get abs path
if [[ -d "${DIR_PATH}" ]] ; Then # Now you're testing
    echo "It's a dir";
fi

जब तक आप उपयोग करते हैं, तब तक रिक्त स्थान और विशेष वर्णों के बारे में चिंता करने की कोई आवश्यकता नहीं है "${}"

ध्यान दें कि [[]]उतना पोर्टेबल नहीं है [], लेकिन चूंकि अधिकांश लोग बैश के आधुनिक संस्करणों के साथ काम करते हैं (क्योंकि आखिरकार, ज्यादातर लोग कमांड लाइन :-p के साथ भी काम नहीं करते हैं), लाभ परेशानी से अधिक है।


17

क्या आपने ifछलांग लगाने से पहले सिर्फ ऐसा करने पर विचार किया है जो आप करना चाहते हैं ?

Ie, यदि आप इसे दर्ज करने से पहले किसी निर्देशिका के अस्तित्व की जाँच करना चाहते हैं, तो बस ऐसा करने का प्रयास करें:

if pushd /path/you/want/to/enter; then
    # Commands you want to run in this directory
    popd
fi

यदि आप pushdमौजूद पथ को देते हैं , तो आप इसे दर्ज करेंगे और इसके साथ बाहर निकलेंगे 0, जिसका अर्थ thenहै कि विवरण का भाग निष्पादित करेगा। यदि यह मौजूद नहीं है, तो कुछ भी नहीं होगा (कुछ आउटपुट के अलावा यह कहते हुए कि निर्देशिका मौजूद नहीं है, जो संभवत: एक सहायक साइड-इंगलिंग के लिए वैसे भी है)।

यह इस से बेहतर लगता है, जिसे खुद को दोहराने की आवश्यकता है:

if [ -d /path/you/want/to/enter ]; then
    pushd /path/you/want/to/enter
    # Commands you want to run in this directory
    popd
fi

एक ही बात के साथ काम करता cd, mv, rm, आदि ... अगर तुम उन्हें फ़ाइलें मौजूद नहीं है कि पर कोशिश करते हैं, वे एक त्रुटि के साथ बाहर निकलें और कहा कि यह मौजूद नहीं है संदेश मुद्रित कर देंगे और आपके thenब्लॉक छोड़ दिया जाएगा। यदि आप उन्हें उन फ़ाइलों पर आज़माते हैं जो मौजूद हैं, तो कमांड निष्पादित होगी और एक स्थिति के साथ बाहर निकल जाएगी 0, जिससे आपका thenब्लॉक निष्पादित हो सकेगा ।


2
पुशड यह करने का सबसे सुरुचिपूर्ण तरीका है। मैं इसे एक उत्तर के रूप में पोस्ट करने वाला था :)
melMass

15

एक से अधिक निर्देशिकाओं की जाँच करने के लिए इस कोड का उपयोग करें:

if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
    # Things to do
fi

आप यह कैसे जाँच सकते हैं कि यह मौजूद नहीं है?
पेरोहुहंटर

15

जाँच करें कि क्या निर्देशिका मौजूद है, बाकी एक बनाएँ:

[ -d "$DIRECTORY" ] || mkdir $DIRECTORY

16
आप mkdir -p "$DIRECTORY"एक ही प्रभाव के लिए उपयोग कर सकते हैं ।
लोगन पिकअप

15
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"

एनबी: कोटा चर एक अच्छा अभ्यास है।

स्पष्टीकरण:

  • -d: जाँच करें कि क्या यह एक निर्देशिका है
  • -L: जांचें कि क्या यह एक प्रतीकात्मक लिंक है

एक स्पष्टीकरण क्रम में होगा ( आपके उत्तर को संपादित करके , टिप्पणियों में यहां नहीं)।
पीटर मोर्टेंसन


11

यह उत्तर एक शेल स्क्रिप्ट के रूप में लिपटा हुआ है

उदाहरण

$ is_dir ~                           
YES

$ is_dir /tmp                        
YES

$ is_dir ~/bin                       
YES

$ mkdir '/tmp/test me'

$ is_dir '/tmp/test me'
YES

$ is_dir /asdf/asdf                  
NO

# Example of calling it in another script
DIR=~/mydata
if [ $(is_dir $DIR) == "NO" ]
then
  echo "Folder doesnt exist: $DIR";
  exit;
fi

is_dir

function show_help()
{
  IT=$(CAT <<EOF

  usage: DIR
  output: YES or NO, depending on whether or not the directory exists.

  )
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$1" ]
then
  show_help
fi

DIR=$1
if [ -d $DIR ]; then 
   echo "YES";
   exit;
fi
echo "NO";

10

-eचेक का उपयोग करने से फाइलों की जांच होगी और इसमें निर्देशिका शामिल है।

if [ -e ${FILE_PATH_AND_NAME} ]
then
    echo "The file or directory exists."
fi

1
और ओपी के सवाल का सही जवाब नहीं देता है - क्या यह एक निर्देशिका है?
मार्क स्टीवर्ट

8

के अनुसार जोनाथन की टिप्पणी:

यदि आप निर्देशिका बनाना चाहते हैं और यह अभी तक मौजूद नहीं है, तो सबसे सरल तकनीक का उपयोग करना है mkdir -pजो निर्देशिका बनाता है - और किसी भी अनुपलब्ध निर्देशिका पथ - और विफल नहीं होता है यदि निर्देशिका पहले से मौजूद है, तो आप यह सब कर सकते हैं एक बार साथ:

mkdir -p /some/directory/you/want/to/exist || exit 1

7
if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists
fi

यह पूरी तरह सच नहीं है ...

यदि आप उस डायरेक्टरी में जाना चाहते हैं, तो आपको डायरेक्टरी पर अमल करने की भी जरूरत है। हो सकता है कि आपको राइट्स भी लिखने हों।

इसलिए:

if [ -d "$DIRECTORY" ] && [ -x "$DIRECTORY" ] ; then
    # ... to go to that directory (even if DIRECTORY is a link)
    cd $DIRECTORY
    pwd
fi

if [ -d "$DIRECTORY" ] && [ -w "$DIRECTORY" ] ; then
    # ... to go to that directory and write something there (even if DIRECTORY is a link)
    cd $DIRECTORY
    touch foobar
fi

7

fileप्रोग्राम का उपयोग करें । सभी निर्देशिकाओं को ध्यान में रखते हुए लिनक्स में फाइलें भी हैं, निम्नलिखित आदेश जारी करना पर्याप्त होगा:

file $directory_name

कोई नहीं फ़ाइल की जाँच कर रहा है: file blah

आउटपुट: cannot open 'blah' (No such file or directory)

मौजूदा निर्देशिका की जाँच: file bluh

आउटपुट: bluh: directory


1
अच्छा विचार, हालांकि दोनों मामलों में बहुत बुरा है, फ़ाइल कमांड हमेशा 0 से बाहर निकलें कोड देता है। इसके अलावा, जब फ़ाइल / निर्देशिका नहीं मिल सकती है :(?
खतरे

6

lsसाथ संयोजन के रूप में आदेश -l(लंबी सूची) विकल्प रिटर्न फ़ाइलों और निर्देशिकाओं के बारे में जानकारी जिम्मेदार बताते हैं।
विशेष रूप से ls -lआउटपुट का पहला चरित्र यह आम तौर पर एक dया -(डैश) है। dसूचीबद्ध के मामले में सुनिश्चित करने के लिए एक निर्देशिका है।

केवल एक पंक्ति में निम्न कमांड आपको बताएगा कि दिए गए ISDIRचर में निर्देशिका का पथ है या नहीं:

[[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
    echo "YES, $ISDIR is a directory." || 
    echo "Sorry, $ISDIR is not a directory"

व्यावहारिक उपयोग:

    [claudio@nowhere ~]$ ISDIR="$HOME/Music" 
    [claudio@nowhere ~]$ ls -ld "$ISDIR"
    drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." ||
        echo "Sorry, $ISDIR is not a directory"
    YES, /home/claudio/Music is a directory.

    [claudio@nowhere ~]$ touch "empty file.txt"
    [claudio@nowhere ~]$ ISDIR="$HOME/empty file.txt" 
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." || 
        echo "Sorry, $ISDIR is not a directoy"
    Sorry, /home/claudio/empty file.txt is not a directory

+1, लेकिन यह तब होता है जब ISDIR बिल्कुल भी मौजूद नहीं होता है और आपको त्रुटि संदेश के साथ-साथ आपके निदान संदेश भी मिलते हैं।
ysap


5

यदि आप यह देखना चाहते हैं कि क्या कोई निर्देशिका मौजूद है, भले ही वह वास्तविक निर्देशिका हो या सीलिंक, तो इसका उपयोग करें:

ls $DIR
if [ $? != 0 ]; then
        echo "Directory $DIR already exists!"
        exit 1;
fi
echo "Directory $DIR does not exist..."

स्पष्टीकरण: "ls" कमांड एक त्रुटि देता है "ls: / x: ऐसी कोई फ़ाइल या निर्देशिका" नहीं है यदि निर्देशिका या सिमलिंक मौजूद नहीं है, और रिटर्न कोड भी सेट करता है, जिसे आप "$?" के माध्यम से प्राप्त कर सकते हैं, गैर को? -नुल (सामान्य रूप से "1")। सुनिश्चित करें कि आप "ls" कॉल करने के बाद सीधे रिटर्न कोड की जांच करते हैं।


3
वैकल्पिक रूप से आप इस छोटे संस्करण का उपयोग कर सकते हैं:if ! ls $DIR 2>/dev/null; then echo "$DIR does not exist!"; fi
derFunk

5

(1)

[ -d Piyush_Drv1 ] && echo ""Exists"" || echo "Not Exists"

(2)

[ `find . -type d -name Piyush_Drv1 -print | wc -l` -eq 1 ] && echo Exists || echo "Not Exists"

(3)

[[ -d run_dir  && ! -L run_dir ]] && echo Exists || echo "Not Exists"

यदि कोई समस्या ऊपर दिए गए दृष्टिकोणों में से एक के साथ पाई जाती है:

lsआज्ञा के साथ ; ऐसे मामले जब कोई निर्देशिका मौजूद नहीं होती है - एक त्रुटि संदेश दिखाया जाता है

[[ `ls -ld SAMPLE_DIR| grep ^d | wc -l` -eq 1 ]] && echo exists || not exists

-ksh: नहीं: नहीं मिला [ऐसी कोई फ़ाइल या निर्देशिका नहीं]


"ऊपर" क्या संदर्भित करता है? इस उत्तर में तीन कमांड लाइन या पिछले उत्तर? (कृपया अपने जवाब को संपादित करके जवाब दें , टिप्पणियों में यहां नहीं। अग्रिम धन्यवाद।)
पीटर मोर्टेंसन

4

वहाँ महान समाधान हैं, लेकिन अंततः हर स्क्रिप्ट विफल हो जाएगी यदि आप सही निर्देशिका में नहीं हैं। तो इस तरह कोड:

if [ -d "$LINK_OR_DIR" ]; then
if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here
    rm "$LINK_OR_DIR"
else
    # It's a directory!
    # Directory command goes here
    rmdir "$LINK_OR_DIR"
fi
fi

सफलतापूर्वक निष्पादित तभी होगा जब निष्पादन के समय आप एक ऐसी निर्देशिका में हों, जिसके पास एक उपनिर्देशिका हो, जिसे आप जांचना चाहते हैं।

मैं इस तरह के प्रारंभिक प्रश्न को समझता हूं: यह सत्यापित करने के लिए कि क्या कोई निर्देशिका फ़ाइल सिस्टम में उपयोगकर्ता की स्थिति के बावजूद मौजूद है। इसलिए कमांड 'खोजने' का उपयोग करने से चाल हो सकती है:

dir=" "
echo "Input directory name to search for:"
read dir
find $HOME -name $dir -type d

यह समाधान अच्छा है क्योंकि यह वाइल्डकार्ड के उपयोग की अनुमति देता है, फाइलों / निर्देशिकाओं की खोज करते समय एक उपयोगी सुविधा। एकमात्र समस्या यह है कि, यदि खोज की गई निर्देशिका मौजूद नहीं है, तो 'खोज' कमांड मानक आउटपुट (मेरे स्वाद के लिए एक सुरुचिपूर्ण समाधान नहीं) के लिए कुछ भी प्रिंट नहीं करेगा और फिर भी शून्य से बाहर निकलेगा। शायद कोई इस पर सुधार कर सके।


13
यदि कोई प्रोग्राम मेरी पूरी हार्ड ड्राइव से एक निर्देशिका खोजने के बजाय अपनी वर्तमान कार्य निर्देशिका में देख रहा है या मैं इसे दे रहा हूं, तो पूर्ण पथ का उपयोग करने से मैं नाराज हो जाऊंगा। आपने जो सुझाव दिया है वह नाम के टूल के लिए अच्छा हो सकता है, locateलेकिन किसी और चीज के लिए अच्छा नहीं ...
sarnold
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.