यदि कोई विशेष फ़ाइल मौजूद है, तो एक मनमाना संदेश प्रदर्शित करने के लिए कमांड


11

यदि कोई विशेष फ़ाइल मौजूद है, तो संदेश "हाँ" प्रदर्शित करने के लिए एक आदेश है? यदि फ़ाइल मौजूद नहीं है तो कार्यक्षमता देने की आवश्यकता नहीं है।

जवाबों:


25

इस साधारण बैश वन-लाइनर का उपयोग करें:

if [ -e FILENAME ] ; then echo Yes ; fi

-eसच करने के लिए चेक का मूल्यांकन करता है, तो FILENAMEमौजूद है, कोई फर्क नहीं पड़ता कि यह क्या है (फ़ाइल, निर्देशिका, लिंक, उपकरण, ...)।

यदि आप केवल नियमित फ़ाइलों की जांच करना चाहते हैं, तो -fइसके बजाय, @Arronical ने कहा।


18
[ -e FILENAME ] && echo Yes
ज़ेब मैककोर्ल

@ZebMcCorkle सही है, यह भी काम करता है। आप अलग उत्तर के रूप में पोस्ट कर सकते हैं।
बाइट कमांडर

3
यदि FILENAMEएक चर विस्तार है, या इसमें कोई विशेष वर्ण है, तो इसे उद्धृत करना न भूलें। एक स्क्रिप्ट में जैसे, [ -e "$1" ] && echo Yes
पीटर कॉर्ड्स

@PeterCordes यदि आप बैश का उपयोग कर रहे हैं तो आप उपयोग कर सकते हैं [[और ]]इसके बजाय चर को उद्धृत कर सकते हैं ।
होलाय

1
@ हेलो: हाँ, लेकिन कभी-कभी आपको पोर्टेबल स्क्रिप्ट लिखने की ज़रूरत होती है, जिसके लिए केवल POSIX sh की आवश्यकता होती है। इसलिए मैंने इसे डाउनवोट करने और बैश जवाब को बढ़ाने के बजाय इसका एक सुरक्षित संस्करण दिया। यह भी ध्यान दें कि यह विस्तार के उद्धरण के लिए समस्या नहीं है [[ ]], हमेशा उद्धृत करना शुरुआती लोगों के लिए एक अच्छी आदत है जो [[ ]]ऑपरेटर के अंदर या अंकगणितीय संदर्भों के लिए विशेष नियमों को याद नहीं करते हैं ।
पीटर कॉर्ड्स

10

आप इस सरल स्क्रिप्ट का उपयोग कर सकते हैं:

#!/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

2
अच्छा है, लेकिन आप जैसे चर संदर्भों को उद्धृत करेंगे "$1"। यदि इसमें सफेद स्थान है, तो यह बिना उद्धरण के टूट जाएगा और अन्य बुरी चीजें हो सकती हैं।
जो

9

कमांड लाइन पर बैश शेल में।

if [[ -f /path/to/file ]]; then echo "Yes"; fi

यह बैश सशर्त ऑपरेटर का उपयोग करता है -f, और जाँच रहा है कि क्या फ़ाइल मौजूद है और एक नियमित फ़ाइल है। यदि आप निर्देशिका और लिंक सहित किसी भी फाइल के लिए परीक्षण करना चाहते हैं तो उपयोग करें -e

यह बैश सशर्त के लिए एक महान संसाधन है।


1
डबल ब्रेसिज़ क्यों?
बाइट कमांडर

1
मैं testइसके मूल प्रारूप का प्रशंसक नहीं हूं , मुझे पता है कि यह ओवरकिल है, लेकिन यह मेरी आदत है।
एरोनिकल

7
@ बाइटकॉमर: डबल ब्रेसेस आमतौर पर सिंगल ब्रेसेस से बेहतर होते हैं। वे शेल सिंटैक्स का हिस्सा हैं ( [कमांड को लागू करने के बजाय , जिसे आमतौर पर एक बिलिन कहते हैं।) वे एकल ब्रेस संस्करण की विसंगतियों और गूंगे व्यवहार को सही करते हैं। [अंतर्निहित संगतता के लिए बनी हुई है, लेकिन मुझे नए बैश कोड में इसका उपयोग करने का कोई अच्छा कारण नहीं दिखता है। (यदि आपको POSIX- संगत स्क्रिप्ट लिखने की ज़रूरत है जो प्राचीन गोले या कुछ और पर चल सकती है, तो यह अलग है।)
निक मैट्टे

@kundor: ज्यादातर सहमत हैं, हालांकि, निष्पक्ष होने के लिए, " [आमतौर पर कॉलिन एक बेसिन " संदिग्ध है। type -a [मेरे लिए "शेल बिलिन" सूचीबद्ध करता है, फिर " /usr/bin/[।"
वचर्जिन

1
@wchargin: मुझे डर है कि मुझे समझ नहीं आ रहा है कि आप क्या कर रहे हैं। आपके typeपरिणाम मुझे बताए गए लगते हैं, नहीं?
निक मैट्टे

5

जो आप चाहते हैं उसे करने के लिए सबसे छोटी कमांड है:

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समतुल्य हैं, सिवाय इसके कि [एक समाप्ति की मांग करता है ]


4

इस प्रकार के सवाल करने के लिए कई तरीके हैं, और यहाँ एक और है: ध्वज के 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 '' "
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.