बैश शेल स्क्रिप्ट के भीतर कोई डायरेक्टरी मौजूद है या नहीं, यह जांचने के लिए किस कमांड का उपयोग किया जा सकता है?
बैश शेल स्क्रिप्ट के भीतर कोई डायरेक्टरी मौजूद है या नहीं, यह जांचने के लिए किस कमांड का उपयोग किया जा सकता है?
जवाबों:
यह जाँचने के लिए कि क्या कोई निर्देशिका शेल स्क्रिप्ट में मौजूद है, आप निम्न का उपयोग कर सकते हैं:
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 द्वारा समझाया गया है ।
यदि चर में स्थान या अन्य असामान्य वर्ण होते हैं तो यह संभवतः स्क्रिप्ट को विफल कर देगा।
[ ! -d "$DIRECTORY" ]
सच या तो करता है, तो हो सकता है $DIRECTORY
मौजूद नहीं है, या यदि करता है मौजूद हैं, लेकिन एक निर्देशिका नहीं है। कुछ इस तरह से विचार करें if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi
; यदि "$DIRECTORY"
फ़ाइल है तो यह विफल हो जाएगी । (निश्चित रूप से आपको जांचना चाहिए कि क्या mkdir
वैसे भी सफल हुआ? कई कारण हैं जो इसे विफल कर सकते हैं।)
-d
) और सिम्लिंक ( -L
) दोनों के लिए परीक्षण के बजाय , चर की तरह स्लैश को जोड़ना आसान है if [ -d "${THING:+$THING/}" ]
। एक निर्देशिका अतिरिक्त स्लैश को बुरा नहीं मानेगी। एक फ़ाइल झूठी का मूल्यांकन करेगी। खाली तो खाली रहेगा, असत्य है। और एक सीलिंक को उसके गंतव्य के लिए हल किया जाएगा। बेशक, यह आपके लक्ष्य पर निर्भर करता है। अगर आप वहां जाना चाहते हैं , तो यह ठीक है। यदि आप इसे हटाना चाहते हैं , तो इस उत्तर में कोड बेहतर है।
बैश स्क्रिप्ट में उन्हें संदर्भित करते समय हमेशा दोहरे उद्धरण चिह्नों को लपेटने के लिए याद रखें। बच्चे इन दिनों इस विचार के साथ बड़े होते हैं कि उनके निर्देशिका नामों में रिक्त स्थान और बहुत सारे अन्य मजेदार चरित्र हो सकते हैं। (रिक्त स्थान! मेरे दिनों में वापस, हमारे पास कोई फैंसी स्थान नहीं था!))
एक दिन, उन बच्चों में से एक $DIRECTORY
सेट के साथ आपकी स्क्रिप्ट चलाएगा "My M0viez"
और आपकी स्क्रिप्ट उड़ जाएगी। आप ऐसा नहीं चाहते। तो इस का उपयोग करें।
if [ -d "$DIRECTORY" ]; then
# Will enter here if $DIRECTORY exists, even if it contains spaces
fi
नोट -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 ।
if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi
... या, एक कमांड के लिए जो दोनों लिंक और dirs पर काम करता है:rm -r tmpdir
मुझे लगता है कि डबल-ब्रैकेट संस्करण test
लॉजिक टेस्ट को अधिक स्वाभाविक बनाता है:
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
echo "It's a bona-fide directory"
fi
if [[ -d "$TARFILE" ]]
मैं [[: नहीं मिला
[[ ]]
में समर्थित है, लेकिन वास्तव में करने के लिए कोई अलग कार्यक्षमता प्रदान नहीं करता है [ ]
। यदि पोर्टेबिलिटी एक चिंता है, [ ]
तो आवश्यक वर्कअराउंड के साथ रहें और उपयोग करें।
छोटा रूप:
[ -d "$DIR" ] && echo "Yes"
if $dir is a dir, then echo "yes"
:? स्पष्टीकरण का एक सा मदद करेगा :)
cmd && other
के लिए एक सामान्य आशुलिपि है if cmd; then other; fi
- यह अधिकांश प्रोग्रामिंग भाषाओं के साथ काम करता है जो बूलियन तर्क का समर्थन करते हैं, और शॉर्ट-सर्किट मूल्यांकन के रूप में जाना जाता है ।
set -e
(जो एक शेल प्रोग्रामिंग सबसे अच्छा अभ्यास है )।
[ -d "$DIR" ]
जाँच की जाती है (उसके बाद && echo Yes
), इसलिए मेरा मानना set -e
है कि स्क्रिप्ट के व्यवहार पर कोई फर्क नहीं पड़ता (अर्थात यदि परीक्षण विफल हो जाता है, तो स्क्रिप्ट सामान्य रूप से जारी रहती है)।
यह देखने के लिए कि क्या कोई निर्देशिका मौजूद है, आप 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
एक निर्देशिका या फ़ाइल मौजूद है या नहीं, यह जांचने के लिए एक सरल स्क्रिप्ट:
if [ -d /home/ram/dir ] # For file "if [-f /home/rama/file]"
then
echo "dir present"
else
echo "dir not present"
fi
एक साधारण स्क्रिप्ट यह जाँचने के लिए कि निर्देशिका मौजूद है या नहीं:
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' नहीं बना सकता है: फ़ाइल मौजूद है
आप test -d
(देखें man test
) का उपयोग कर सकते हैं ।
-d file
यदि फ़ाइल मौजूद है तो सच है और एक निर्देशिका है।
उदाहरण के लिए:
test -d "/etc" && echo Exists || echo Does not exist
नोट: test
कमांड सशर्त अभिव्यक्ति के समान है [
(देखें man [
:), इसलिए यह शेल स्क्रिप्ट्स में पोर्टेबल है।
[
- यह बिलिन के लिए एक पर्याय हैtest
, लेकिन अंतिम तर्क को]
उद्घाटन से मेल खाना चाहिए[
।
संभावित विकल्पों या आगे की मदद के लिए, देखें:
help [
help test
man test
या man [
या कुछ पूरी तरह से बेकार के लिए:
[ -d . ] || echo "No"
यहाँ बहुत ही व्यावहारिक मुहावरा है:
(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 समझाया गया है।
test -d /unreadable/exists
विफल होगा, भले ही तर्क मौजूद हो।
if [ -d "$Directory" -a -w "$Directory" ]
then
#Statements
fi
उपरोक्त कोड यह जाँचता है कि क्या निर्देशिका मौजूद है और यदि यह उपयुक्त है।
DIRECTORY=/tmp
if [ -d "$DIRECTORY" ]; then
echo "Exists"
fi
space
बाद रीमाइबर [
-> [``-डी । मुझे लापता स्थान के कारण त्रुटि मिली
यह कोड बैश प्रॉम्प्ट पर टाइप करें:
if [ -d "$DIRECTORY" ]; then
# If true this block of code will execute
fi
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'
। क्या आपको बुरा लगता है अगर मैं आपके उत्तर में इस चाल को जोड़ दूं? चीयर्स;)
वास्तव में, आपको बुलेटप्रूफ दृष्टिकोण प्राप्त करने के लिए कई उपकरणों का उपयोग करना चाहिए:
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 के साथ भी काम नहीं करते हैं), लाभ परेशानी से अधिक है।
क्या आपने 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
ब्लॉक निष्पादित हो सकेगा ।
एक से अधिक निर्देशिकाओं की जाँच करने के लिए इस कोड का उपयोग करें:
if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
# Things to do
fi
जाँच करें कि क्या निर्देशिका मौजूद है, बाकी एक बनाएँ:
[ -d "$DIRECTORY" ] || mkdir $DIRECTORY
mkdir -p "$DIRECTORY"
एक ही प्रभाव के लिए उपयोग कर सकते हैं ।
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"
एनबी: कोटा चर एक अच्छा अभ्यास है।
स्पष्टीकरण:
-d
: जाँच करें कि क्या यह एक निर्देशिका है-L
: जांचें कि क्या यह एक प्रतीकात्मक लिंक है[ -d ~/Desktop/TEMPORAL/ ] && echo "DIRECTORY EXISTS" || echo "DIRECTORY DOES NOT EXIST"
यह उत्तर एक शेल स्क्रिप्ट के रूप में लिपटा हुआ है
$ 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
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";
-e
चेक का उपयोग करने से फाइलों की जांच होगी और इसमें निर्देशिका शामिल है।
if [ -e ${FILE_PATH_AND_NAME} ]
then
echo "The file or directory exists."
fi
के अनुसार जोनाथन की टिप्पणी:
यदि आप निर्देशिका बनाना चाहते हैं और यह अभी तक मौजूद नहीं है, तो सबसे सरल तकनीक का उपयोग करना है mkdir -p
जो निर्देशिका बनाता है - और किसी भी अनुपलब्ध निर्देशिका पथ - और विफल नहीं होता है यदि निर्देशिका पहले से मौजूद है, तो आप यह सब कर सकते हैं एक बार साथ:
mkdir -p /some/directory/you/want/to/exist || exit 1
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
file
प्रोग्राम का उपयोग करें । सभी निर्देशिकाओं को ध्यान में रखते हुए लिनक्स में फाइलें भी हैं, निम्नलिखित आदेश जारी करना पर्याप्त होगा:
file $directory_name
कोई नहीं फ़ाइल की जाँच कर रहा है: file blah
आउटपुट: cannot open 'blah' (No such file or directory)
मौजूदा निर्देशिका की जाँच: file bluh
आउटपुट: bluh: directory
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
file="foo"
if [[ -e "$file" ]]; then echo "File Exists"; fi;
यदि आप यह देखना चाहते हैं कि क्या कोई निर्देशिका मौजूद है, भले ही वह वास्तविक निर्देशिका हो या सीलिंक, तो इसका उपयोग करें:
ls $DIR
if [ $? != 0 ]; then
echo "Directory $DIR already exists!"
exit 1;
fi
echo "Directory $DIR does not exist..."
स्पष्टीकरण: "ls" कमांड एक त्रुटि देता है "ls: / x: ऐसी कोई फ़ाइल या निर्देशिका" नहीं है यदि निर्देशिका या सिमलिंक मौजूद नहीं है, और रिटर्न कोड भी सेट करता है, जिसे आप "$?" के माध्यम से प्राप्त कर सकते हैं, गैर को? -नुल (सामान्य रूप से "1")। सुनिश्चित करें कि आप "ls" कॉल करने के बाद सीधे रिटर्न कोड की जांच करते हैं।
if ! ls $DIR 2>/dev/null; then echo "$DIR does not exist!"; fi
(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: नहीं: नहीं मिला [ऐसी कोई फ़ाइल या निर्देशिका नहीं]
वहाँ महान समाधान हैं, लेकिन अंततः हर स्क्रिप्ट विफल हो जाएगी यदि आप सही निर्देशिका में नहीं हैं। तो इस तरह कोड:
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
यह समाधान अच्छा है क्योंकि यह वाइल्डकार्ड के उपयोग की अनुमति देता है, फाइलों / निर्देशिकाओं की खोज करते समय एक उपयोगी सुविधा। एकमात्र समस्या यह है कि, यदि खोज की गई निर्देशिका मौजूद नहीं है, तो 'खोज' कमांड मानक आउटपुट (मेरे स्वाद के लिए एक सुरुचिपूर्ण समाधान नहीं) के लिए कुछ भी प्रिंट नहीं करेगा और फिर भी शून्य से बाहर निकलेगा। शायद कोई इस पर सुधार कर सके।
locate
लेकिन किसी और चीज के लिए अच्छा नहीं ...
--
तो अत्यधिक अनुशंसित (एंड-ऑफ़-ऑप्शंस मार्कर) का उपयोग किया जाता है। अन्यथा, यदि आपके चर में कुछ ऐसा है जो एक विकल्प की तरह दिखता है, तो स्क्रिप्ट रिक्त स्थान के साथ विफल हो जाएगी।