जवाबों:
इस साधारण बैश वन-लाइनर का उपयोग करें:
if [ -e FILENAME ] ; then echo Yes ; fi
-eसच करने के लिए चेक का मूल्यांकन करता है, तो FILENAMEमौजूद है, कोई फर्क नहीं पड़ता कि यह क्या है (फ़ाइल, निर्देशिका, लिंक, उपकरण, ...)।
यदि आप केवल नियमित फ़ाइलों की जांच करना चाहते हैं, तो -fइसके बजाय, @Arronical ने कहा।
FILENAMEएक चर विस्तार है, या इसमें कोई विशेष वर्ण है, तो इसे उद्धृत करना न भूलें। एक स्क्रिप्ट में जैसे, [ -e "$1" ] && echo Yes।
[[और ]]इसके बजाय चर को उद्धृत कर सकते हैं ।
[[ ]], हमेशा उद्धृत करना शुरुआती लोगों के लिए एक अच्छी आदत है जो [[ ]]ऑपरेटर के अंदर या अंकगणितीय संदर्भों के लिए विशेष नियमों को याद नहीं करते हैं ।
आप इस सरल स्क्रिप्ट का उपयोग कर सकते हैं:
#!/bin/bash
if [[ -f $1 ]]; then
echo "Yes"
exit 0
else
exit 1
fi
इसे इस रूप में सहेजें file-exists.sh। फिर, टर्मिनल में, टाइप करें chmod +x file-exists.sh।
इसे इस तरह उपयोग करें: ./file-exists.sh FILEजहाँ आप FILEउस फ़ाइल से प्रतिस्थापित करते हैं जिसे आप जाँचना चाहते हैं, उदाहरण के लिए:
./file-exists.sh file.txt
यदि file.txtमौजूद है, Yesतो टर्मिनल पर मुद्रित किया जाएगा, और प्रोग्राम 0 (सफलता) स्थिति से बाहर निकल जाएगा। यदि फ़ाइल मौजूद नहीं है, तो कुछ भी मुद्रित नहीं किया जाएगा और कार्यक्रम स्थिति 1 (विफलता) के साथ बाहर निकल जाएगा।
यदि आप उत्सुक हैं कि मैंने exitकमान क्यों शामिल की , तो पढ़ें ...
exitहुक्म है?exitसामान्य प्रक्रिया समाप्ति का कारण बनता है। इसका मतलब क्या है, मूल रूप से: यह स्क्रिप्ट को रोकता है। यह एक वैकल्पिक (संख्यात्मक) पैरामीटर को स्वीकार करता है जो उस स्क्रिप्ट की निकास स्थिति होगी जो इसे कहते हैं।
यह निकास स्थिति आपकी स्क्रिप्ट का उपयोग करने के लिए आपकी अन्य लिपियों को सक्षम करती है file-existsऔर फ़ाइल को जानने का उनका तरीका मौजूद है या नहीं।
एक सरल उदाहरण जो इसे उपयोग करने के लिए रखता है वह है इस स्क्रिप्ट (इसे इस रूप में सहेजें file-exists-cli.sh):
#!/bin/bash
echo "Enter a filename and I will tell you if it exists or not: "
read FILE
# Run `file-exists.sh` but discard any output because we don't need it in this example
./file-exists.sh $FILE &>> /dev/null
# #? is a special variable that holds the exit status of the previous command
if [[ $? == 0 ]]; then
echo "$FILE exists"
else
echo "$FILE does not exist"
fi
सामान्य करें chmod +x file-exists-cli.shऔर फिर इसे चलाएं ./file-exists-cli.sh:। आप कुछ इस तरह देखेंगे:
फ़ाइल मौजूद है ( exit 0):
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
booleans.py
booleans.py exists
फ़ाइल मौजूद नहीं है ( exit 1):
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
asdf
asdf does not exist
"$1"। यदि इसमें सफेद स्थान है, तो यह बिना उद्धरण के टूट जाएगा और अन्य बुरी चीजें हो सकती हैं।
कमांड लाइन पर बैश शेल में।
if [[ -f /path/to/file ]]; then echo "Yes"; fi
यह बैश सशर्त ऑपरेटर का उपयोग करता है -f, और जाँच रहा है कि क्या फ़ाइल मौजूद है और एक नियमित फ़ाइल है। यदि आप निर्देशिका और लिंक सहित किसी भी फाइल के लिए परीक्षण करना चाहते हैं तो उपयोग करें -e।
testइसके मूल प्रारूप का प्रशंसक नहीं हूं , मुझे पता है कि यह ओवरकिल है, लेकिन यह मेरी आदत है।
[कमांड को लागू करने के बजाय , जिसे आमतौर पर एक बिलिन कहते हैं।) वे एकल ब्रेस संस्करण की विसंगतियों और गूंगे व्यवहार को सही करते हैं। [अंतर्निहित संगतता के लिए बनी हुई है, लेकिन मुझे नए बैश कोड में इसका उपयोग करने का कोई अच्छा कारण नहीं दिखता है। (यदि आपको POSIX- संगत स्क्रिप्ट लिखने की ज़रूरत है जो प्राचीन गोले या कुछ और पर चल सकती है, तो यह अलग है।)
[आमतौर पर कॉलिन एक बेसिन " संदिग्ध है। type -a [मेरे लिए "शेल बिलिन" सूचीबद्ध करता है, फिर " /usr/bin/[।"
typeपरिणाम मुझे बताए गए लगते हैं, नहीं?
जो आप चाहते हैं उसे करने के लिए सबसे छोटी कमांड है:
test -e FILENAME && echo Yes
test -eयह परीक्षण करेगा कि दिया गया नाम फाइल सिस्टम में मौजूद है या नहीं। (आप test -fकेवल नियमित फ़ाइलों तक सीमित करने के लिए उपयोग कर सकते हैं । man testअधिक के लिए देखें ।)
यदि दी गई स्थिति सत्य का मूल्यांकन करती है, तो testएक सफल निकास स्थिति (अन्यथा यह विफलता की स्थिति लौटाती है) लौटाती है। हम दो कमांड्स का उपयोग करते हुए गठबंधन करते हैं &&, जिसका अर्थ है "अगले कमांड को निष्पादित करें यदि पिछली कमांड एक सफलता की स्थिति के साथ बाहर निकले"। अगला कमांड बस Yesमानक आउटपुट पर प्रिंट करता है; टर्मिनल पर एक इंटरैक्टिव शेल के मामले में।
यह एक ifबयान की अतिरिक्त पाठ्य सामग्री से बचा जाता है , फिर भी वही परिणाम देता है। कमांड को एक साथ जोड़ने के लिए &&(या इसके विपरीत ||) का उपयोग करना अच्छी तरह से काम करता है जब केवल एक ही कमांड शामिल होता है। यदि आप किसी एकल कमांड के एक्ज़िट स्टेटस के जवाब में सिंगल कमांड को निष्पादित करने से अधिक करना चाहते हैं, तो ifसिंटैक्स का उपयोग करना जल्दी से पढ़ने योग्य हो जाता है।
जैसा कि पहले से ही अन्य उत्तरों में बताया गया है, समतुल्य ifशैली निर्माण होगा:
if test -e FILENAME; then echo Yes; fi
या वैकल्पिक रूप से:
if test -e FILENAME
then
echo Yes
fi
इन उद्देश्यों के लिए, [और testसमतुल्य हैं, सिवाय इसके कि [एक समाप्ति की मांग करता है ]।
इस प्रकार के सवाल करने के लिए कई तरीके हैं, और यहाँ एक और है: ध्वज के findसाथ कमांड का उपयोग करें -exec। फ़ाइल करने का मार्ग दो भागों में विभाजित किया जा सकता है find /etcजो निर्देशिका सेट करता है और -name FILENAMEजो फ़ाइल नाम (duh!) निर्दिष्ट करता है। -maxdepthरखेंगे findके साथ काम /etcकेवल निर्देशिका और उप निर्देशिकाओं में उतर नहीं होंगे
adminx@L455D:~$ find /etc -maxdepth 1 -name passwd -exec printf "YES\n" \;
YES
adminx@L455D:~$ find /etc -maxdepth 1 -name passwd1 -exec printf "YES\n" \;
adminx@L455D:~$
एक और तरीका, के माध्यम से stat:
adminx@L455D:~$ stat /etc/passwd1 &>/dev/null && echo YES
adminx@L455D:~$ stat /etc/passwd &>/dev/null && echo YES
YES
और वैकल्पिक रूप से अजगर के माध्यम से:
>>> import os
>>> if os.stat('/etc/passwd'):
... print 'YES'
...
YES
>>> if os.stat('/etc/passwd1'):
... print 'YES'
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/etc/passwd1'
या एक छोटी कमांड लाइन विकल्प:
python -c "from os.path import exists; print 'Yes' if exists('/etc/fstab') else '' "
[ -e FILENAME ] && echo Yes