मैं कैसे बताऊं कि क्या कोई नियमित फ़ाइल बैश में मौजूद नहीं है?


3260

मैंने निम्न स्क्रिप्ट का उपयोग यह देखने के लिए किया है कि क्या कोई फ़ाइल मौजूद है:

#!/bin/bash

FILE=$1     
if [ -f $FILE ]; then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

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

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
fi

187
मुझे बैश सशर्त बयानों की यह सूची बहुत उपयोगी लगी है।
Saulius itaemaitaitis

9
बहुत आलसी व्यक्ति जो मैं हूं, होने के नाते, मैं आमतौर पर निम्नलिखित मूर्खतापूर्ण वर्कअराउंड निर्माण का उपयोग करता था: if [ -f $FILE ]; then; else; echo "File $FILE does not exist."; fi;संभवतः अच्छा है कि मुझे इसके बजाय यह प्रश्न मिला और इसे अधिक उचित तरीके से करना सीखा। :)
अधरथ

5
पेंडेंटिक होने के लिए, आपको "नियमित फ़ाइल" कहना चाहिए, क्योंकि अधिकांश UNIX / POSIX डॉक्स सामान्य रूप से सभी प्रकार की फाइल सिस्टम प्रविष्टियों को एक "फाइल" के रूप में संदर्भित करते हैं, उदाहरण के लिए, एक प्रतीकात्मक लिंक एक फ़ाइल का एक प्रकार है, जैसा कि एक नामित पाइप है , नियमित फ़ाइल, निर्देशिका, ब्लॉक विशेष, चरित्र विशेष, सॉकेट, आदि
kevinarpe

11
@kevinarpe यदि आप परीक्षण करना चाहते हैं कि क्या कुछ मौजूद है, उपयोग करें -e। - यदि निर्देशिका,
सिम्बलिंक

14
सुरक्षित होने के लिए, हमेशा FILE=$1FILE="$1"if [ -f $FILE ];if [ -f "$FILE" ];
व्हॉट्सएप के

जवाबों:


4520

परीक्षण आदेश ( [यहाँ) एक "नहीं" तार्किक ऑपरेटर जो विस्मयादिबोधक बिंदु (कई अन्य भाषाओं के समान) है। इसे इस्तेमाल करे:

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi

208
अधिक रसीला: [! -f /tmp/foo.txt] && गूंज "फ़ाइल नहीं मिली!"
डेविडवर्थबॉटम सिप

38
मैंने "अगर 2 फ़ाइलों में से कोई भी मौजूद नहीं है" के लिए सही वाक्यविन्यास खोजने के लिए थोड़ा संघर्ष किया। निम्नलिखित दोनों काम:if [ ! \( -f "f1" -a -f "f2" \) ] ; then echo MISSING; fi if [ ! -f "f1" ] || [ ! -f "f2" ] ; then echo MISSING; fi
mivk

153
@ डेविडविंटरबॉटम और भी अधिक संक्षेप में:[ -f /tmp/foo.txt ] || echo "File not found!"
डेविड डब्ल्यू।

27
पैरामीटर निम्नलिखित में से कोई भी हो सकता है:-e: Returns true value, if file exists -f: Return true value, if file exists and regular file -r: Return true value, if file exists and is readable -w: Return true value, if file exists and is writable -x: Return true value, if file exists and is executable -d: Return true value, if exists and is a directory
SD।

5
वहाँ का उपयोग करने में एक विषमता है ! -fके साथ &&का उपयोग कर बनाम -fसाथ ||। यह गैर / अस्तित्व की जाँच के द्वारा दिए गए निकास कोड के साथ करना है। यदि आपको अपनी लाइन को हमेशा एक्जिट कोड 0 (और कभी-कभी आप इस बाधा नहीं चाहते हैं) के साथ बाहर निकलने की आवश्यकता होती है, तो दो दृष्टिकोण विनिमेय नहीं हैं। वैकल्पिक रूप से, बस एक ifबयान का उपयोग करें और अब आपको अपने गैर / अस्तित्व चेक के निकास कोड के बारे में चिंता करने की कोई आवश्यकता नहीं है।
एक्यूमेनस

670

बैश फाइल टेस्टिंग

-b filename- विशेष फ़ाइल को ब्लॉक करें
-c filename- विशेष वर्ण फ़ाइल
-d directoryname- निर्देशिका के लिए जाँच करें अस्तित्व
-e filename- फ़ाइल अस्तित्व की जाँच करें, भले ही प्रकार (नोड, निर्देशिका, सॉकेट, आदि) की
-f filenameजाँच करें - नियमित फ़ाइल अस्तित्व की
-G filenameजाँच करें निर्देशिका नहीं - जाँच करें कि क्या फ़ाइल मौजूद है और उसके स्वामित्व में है प्रभावी समूह आईडी
-G filename set-group-id- सही है अगर फ़ाइल मौजूद है और सेट-ग्रुप-आईडी है
-k filename- स्टिकी बिट
-L filename- प्रतीकात्मक लिंक
-O filename- अगर फ़ाइल मौजूद है और यह प्रभावी उपयोगकर्ता आईडी के स्वामित्व में है
-r filename- जाँच करें कि क्या फ़ाइल पढ़ने योग्य है
-S filename- जाँच करें कि क्या फ़ाइल सॉकेट है
-s filename- जाँच करें यदि फ़ाइल ग़ैर-आकार की है
-u filename- जाँच करें कि क्या फ़ाइल सेट-यूज़र-आईडी बिट सेट है
-w filename- जाँच करें कि क्या फ़ाइल लिखने योग्य है
-x filename- जाँच करें कि क्या फ़ाइल निष्पादन योग्य है

कैसे इस्तेमाल करे:

#!/bin/bash
file=./file
if [ -e "$file" ]; then
    echo "File exists"
else 
    echo "File does not exist"
fi 

ऑपरेटर का उपयोग करके एक परीक्षण अभिव्यक्ति को नकारा जा सकता है!

#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
    echo "File does not exist"
else 
    echo "File exists"
fi 

1
@ 0x90 यदि आप चाहें, तो आप मेरी पोस्ट को संपादित करने और सूची में जोड़ने के लिए स्वतंत्र हैं। मुझे लगता है कि आपका मतलब है: -n String- जांचें कि क्या स्ट्रिंग की लंबाई शून्य नहीं है। या क्या आपका मतलब है file1 -nt file2- जाँच करें कि अगर file1 नया है तो फ़ाइल 2 (आप पुराने के लिए -ot का उपयोग भी कर सकते हैं)
BlueCacti

1
बारे में -n: The unary operator -z tests for a null string, while -n or no operator at all returns True if a string is not empty.~ ibm.com/developerworks/library/l-bash-test/index.html
BlueCacti

1
कुछ ने फ़ंक्शन को क्यों नहीं जोड़ा जैसे फ़ंक्शन मौजूद है () {-यदि [-e "$ 1"]; तब गूंज "$ 1 मौजूद है" और प्रतिध्वनि "$ 1 मौजूद नहीं है" फाई}
Mz A

291

आप "" के साथ एक अभिव्यक्ति को नकार सकते हैं:

#!/bin/bash
FILE=$1

if [ ! -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

प्रासंगिक आदमी पेज है man testया, समतुल्य रूप, man [- या help testया help [के लिए निर्मित बैश आदेश।


4
में bash , [अंतर्निहित है। इसलिए प्रासंगिक जानकारी इसके द्वारा प्राप्त की जाती है help [... लेकिन यह दिखाता है कि [यह बिलिन के लिए एक पर्याय है test, इसलिए प्रासंगिक जानकारी इसके द्वारा प्राप्त की जाती है help testमैनुअल में बैश कंडिशनल एक्सप्रेशन सेक्शन भी देखें ।
गनीउर_ग्निरॉफ

@gniourf_gniourf: हाँ, पर पार्टी में निर्मित [आदेश बर्ताव करता है बिल्कुल उसी प्रकार बाहरी करने के लिए [आदेश है, तो या तो man testया man [आप यह कैसे काम करता की एक अच्छा विचार दे देंगे।
कीथ थॉम्पसन

8
सिवाय @KeithThompson कि बैश builtin [अधिक स्विच से बाहरी आदेश है [अपने सिस्टम पर पाया ... सामान्य शब्दों में मेरा मानना है कि यह किसी दिए गए उपकरण के लिए प्रलेखन विशिष्ट है, और नहीं एक और अस्पष्ट संबंधित एक के लिए प्रलेखन विशिष्ट पढ़ने के लिए बेहतर है। मैं गलत हो सकता हूं, हालांकि;)
gniourf_gniourf

134
[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

इसके अलावा, यह संभव है कि फ़ाइल एक टूटी हुई प्रतीकात्मक कड़ी हो, या एक गैर-नियमित फ़ाइल, जैसे कि सॉकेट, डिवाइस या फिफो। उदाहरण के लिए, टूटे हुए सिमलिंक के लिए एक चेक जोड़ने के लिए:

if [[ ! -f $FILE ]]; then
    if [[ -L $FILE ]]; then
        printf '%s is a broken symlink!\n' "$FILE"
    else
        printf '%s does not exist!\n' "$FILE"
    fi
fi

9
क्या मैं पूछ सकता हूं कि परीक्षण में दो "[" क्यों हैं? (उदाहरण [[-a $ FILE]])। मैंने एक सोलारिस बॉक्स पर उल्लिखित सभी विकल्पों को आज़माया और केवल एक ही काम किया, इतना आभारी, लेकिन क्यों?
दिमित्रियो मिस्त्रियोसिस

30
डबल कोष्ठक एक "आधुनिक" विस्तार है; उदाहरण के लिए वे शब्द विभाजन नहीं करेंगे (जैसे रिक्त स्थान वाले फ़ाइलनाम के लिए) और फिर भी खाली तारों के लिए काम करते हैं: mywiki.wooledge.org/BashFAQ/031
bw1024

7
tldp.org/LDP/abs/html/fto.html -a के अनुसार प्रभाव -e में समान है। यह "पदावनत" कर दिया गया है, और इसका उपयोग हतोत्साहित किया जाता है। किसी भी तरह से टूटी हुई सिमलिंक पर भी जाँच के लिए +1
Luca Borrione

4
@dimitrismistriotis दो "[" zsh & bash द्वारा कार्यान्वित (गैर-पोर्टेबल) एक गैर-पोर्टेबल एक्सटेंशन है; यदि संभव हो तो आमतौर पर आपको इससे बचना चाहिए।
अच्छा व्यक्ति

7
मैंने इस BECAUSE वोट का इस्तेमाल किया [[। यह व्यापक रूप से उपयोग किया जाने वाला विस्तार है। यदि आप जानते हैं कि आप बैश का उपयोग कर रहे हैं तो इसका उपयोग नहीं करने का कोई कारण नहीं है। यह [की तुलना में बहुत कम त्रुटि प्रवण है।
माइकल पॉटर

101

यह ध्यान देने योग्य है कि यदि आपको किसी एकल कमांड को निष्पादित करने की आवश्यकता है जिसे आप संक्षिप्त कर सकते हैं

if [ ! -f "$file" ]; then
    echo "$file"
fi

सेवा

test -f "$file" || echo "$file"

या

[ -f "$file" ] || echo "$file"

धन्यवाद! एक विकल्प की आवश्यकता है जो [[]] का उपयोग नहीं करता है
जोनाथन

69

मैं POSIX शेल संगत प्रारूप में निम्न एक-लाइनर करना पसंद करता हूं :

$ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND"

$ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"

कुछ कमांड के लिए, जैसे मैं एक स्क्रिप्ट में करूंगा:

$  [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}

एक बार जब मैंने ऐसा करना शुरू कर दिया, तो मैं अब शायद ही कभी पूरी तरह से टाइप किए गए वाक्यविन्यास का उपयोग करता हूं !!


1
सबसे पहले, निर्विवाद चर संदर्भ त्रुटि-प्रवण हैं। उस ने कहा, यह किसी भी बैश मैनपेज में कहां कहा गया है कि [या testअंतर्निहित डिफ़ॉल्ट रूप से तर्क के फ़ाइल अस्तित्व के लिए परीक्षण करेगा (जैसा कि विरोध किया गया है -e)? क्या वह अस्पष्ट नहीं होगा? AFAIK (और AIUI अनुभाग "CONDITIONAL EXPRESSIONS") केवल एक चीज जो आपके दृष्टिकोण से जांची जाती है वह यह है कि तर्क खाली नहीं है (या अपरिभाषित), जो कि इस मामले में, एक तनातनी है (चलो $DIR = ''और $FILE = '', तब तर्क अभी भी है) '//')।
2

1
प्रमाण: ls /fooपरिणाम ls: cannot access /foo: No such file or directory[ /foo ] && echo 42, परिणाम 42। GNU बैश, संस्करण 4.2.37 (1) -release (i486-pc-linux-gnu)।
3

@PointedEars: मैं -fविकल्प को निर्दिष्ट करने में विफल रहा , फिलहाल मैंने यह उत्तर लिखा है। स्पष्ट रूप से आप हमेशा उपयोग कर सकते हैं -e, यदि आपका सुनिश्चित नहीं है कि यह एक नियमित फ़ाइल होगी। इसके अतिरिक्त मेरी सभी लिपियों में मैं इन निर्माणों को उद्धृत करता हूं, मुझे बस इसे पर्याप्त प्रमाण के बिना प्रस्तुत करना चाहिए।
जेएम बेकर

एसीके। लेकिन आप शायद जानते हैं कि वन-लाइनर इफ़-इवन समस्या को हल नहीं कर सकता है: [ $condition ] && if_true || if_falseत्रुटि-प्रवण। किसी भी घटना में, मुझे [ ! -f "$file" ] && if_not_existsपढ़ने और समझने में आसानी होती है [ -f "$file" ] || if_not_exists
पॉइंटेडर्स

55

फ़ाइल अस्तित्व का परीक्षण करने के लिए, पैरामीटर निम्न में से कोई एक हो सकता है:

-e: Returns true if file exists (regular file, directory, or symlink)
-f: Returns true if file exists and is a regular file
-d: Returns true if file exists and is a directory
-h: Returns true if file exists and is a symlink

नीचे दी गई सभी परीक्षाएँ नियमित फाइलों, निर्देशिकाओं और सिमिलिंक पर लागू होती हैं:

-r: Returns true if file exists and is readable
-w: Returns true if file exists and is writable
-x: Returns true if file exists and is executable
-s: Returns true if file exists and has a size > 0

उदाहरण लिपि:

#!/bin/bash
FILE=$1

if [ -f "$FILE" ]; then
   echo "File $FILE exists"
else
   echo "File $FILE does not exist"
fi

39

तुम यह केर सकते हो:

[[ ! -f "$FILE" ]] && echo "File doesn't exist"

या

if [[ ! -f "$FILE" ]]; then
    echo "File doesn't exist"
fi

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


1
वह बैश-विशिष्ट नहीं है। सिंटैक्स कोर्न शेल से आता है और यह ज़ीश और बैश में भी उपलब्ध है। [हालांकि यहां मानक उपयोगिता पर इसका सीमित लाभ है ।
स्टीफन चेजेलस

नियमित फाइलें (जैसा कि चेक किया गया है -f) और निर्देशिका कई अलग-अलग प्रकार की फाइलों में से सिर्फ दो हैं । वहाँ भी सॉकेट, सिमलिंक, डिवाइस, फ़ोरोस, दरवाज़े हैं ... [ -eफ़ाइल अस्तित्व के लिए परीक्षण करेंगे (किसी भी प्रकार के नियमित, फ़ोरो, डायरेक्टरी ...) के बाद सिमलिंक रिज़ॉल्यूशन
स्टीफन चेजलस

@ स्टेफ़ेनचेज़लस: मुझे कहीं भी कोई ksh या zsh टैग नहीं दिखता। हम बैश या किसी ऐसी चीज के बारे में बात कर रहे हैं जो अधिकांश यूनिक्स प्रणालियों पर मानकीकृत है। इसलिए, संदर्भ के भीतर, यह विशिष्ट है। ओपी को हर उस गोले के बारे में जानने की जरूरत नहीं है: D
Jahid

यह आपके उत्तर के "बैश विशिष्ट" भाग पर एक टिप्पणी थी ।
स्टीफन चेजेलस

@ स्टेफ़ेनचेज़लस: हाँ, और संदर्भ के भीतर (बैश और मानक श), यह बैश विशिष्ट है। मुझे आपकी दूसरी टिप्पणी में बात नहीं दिख रही है, यह पूरी तरह से संदर्भ से बाहर है। ओपी को जरूरत नहीं है -e, उसे जरूरत है -f
जाहिद

35

आपको testएक अयोग्य संस्करण के लिए चलने के बारे में सावधान रहना चाहिए , क्योंकि यह अप्रत्याशित परिणाम उत्पन्न कर सकता है:

$ [ -f ]
$ echo $?
0
$ [ -f "" ]
$ echo $?
1

सिफारिश आमतौर पर परीक्षण किए गए चर को दोहरे उद्धरण चिह्नों से घिरा हुआ है:

#!/bin/sh
FILE=$1

if [ ! -f "$FILE" ]
then
   echo "File $FILE does not exist."
fi

8
अनुशंसा है कि प्रत्येक चर को दोहरे उद्धरण चिह्नों से घिरा हुआ है, जब तक कि आप वास्तव में नहीं जानते हैं कि आपके पास दुर्लभ मामलों में से एक है जहां यह अनावश्यक है, या यहां तक ​​कि दुर्लभ मामलों में से एक है जहां यह हानिकारक है। (और नहीं, यह उनमें से एक नहीं है।)
उवे

क्या आप इस बात का ध्यान रखना चाहेंगे कि दोहरे उद्धरण चिह्न का उपयोग करने की स्थिति क्यों नहीं है? अन्यथा मुझे टिप्पणी में उपयोगिता नहीं दिखती।
अरदतनिल

4
मेरा मतलब था: यह दुर्लभ मामलों में से एक नहीं है जहां यह अनावश्यक या हानिकारक है। एक शेल प्रोग्रामर को प्रत्येक चर को दोहरे उद्धरणों में संलग्न करने के लिए उपयोग किया जाना चाहिए; यह नियम सीमित नहीं है [ ... ]
उवे

यह भी देखें stackoverflow.com/questions/10067266/…
tripleee

24

ऐसा करने के तीन अलग-अलग तरीके हैं:

  1. बैश के साथ निकास स्थिति को हटा दें (किसी अन्य उत्तर ने यह नहीं कहा है):

    if ! [ -e "$file" ]; then
        echo "file does not exist"
    fi

    या:

    ! [ -e "$file" ] && echo "file does not exist"
  2. परीक्षण कमांड के अंदर परीक्षण को हटाएं [(प्रस्तुत करने से पहले अधिकांश उत्तर जिस तरह से हैं):

    if [ ! -e "$file" ]; then
        echo "file does not exist"
    fi

    या:

    [ ! -e "$file" ] && echo "file does not exist"
  3. परीक्षण नकारात्मक होने के ||बजाय परिणाम पर अधिनियम&& ):

    केवल:

    [ -e "$file" ] || echo "file does not exist"

    यह मूर्खतापूर्ण (IMO) दिखता है, इसका उपयोग तब तक न करें जब तक कि आपके कोड को बॉर्न शेल (जैसे कि /bin/shसोलारिस 10 या उससे पहले का) पोर्टेबल न हो, जिसमें पाइपलाइन निगेटिव ऑपरेटर ( !) का अभाव था :

    if [ -e "$file" ]; then
        :
    else
        echo "file does not exist"
    fi

के बीच कोई पोर्टेबिलिटी अंतर ! [और [ !?
फ्रोजन फ्लेम

3
! [ खोल पाइपलाइनों 2.9.2 (किसी भी कमांड) के लिए POSIX है Otherwise, the exit status shall be the logical NOT of the exit status of the last command और [ ! परीक्षण के लिए POSIX है ! expression True if expression is false. False if expression is true. तो, दोनों POSIX हैं, और मेरे अनुभव में, दोनों बड़े पैमाने पर समर्थित हैं।

1
@FrozenFlame, बॉर्न शेल में वह !कीवर्ड नहीं था जिसे कॉर्न शेल द्वारा पेश किया गया था। शायद Solaris 10 और पुराने को छोड़कर, आप इन दिनों एक बॉर्न शेल में आने की संभावना नहीं हैं।
स्टीफन चेजलस

22

में

[ -f "$file" ]

यदि सिस्टम कॉल सफल होता है और फाइल के प्रकार " नियमित " है , तो [कमांड एक stat()(नहीं lstat()) सिस्टम कॉल को स्टोर करता है $fileऔर वापस लौटाता हैstat()

इसलिए अगर यह [ -f "$file" ]सच है, तो आप बता सकते हैं कि फाइल मौजूद है और एक नियमित फाइल है या एक सिमलिंक अंततः एक नियमित फाइल में हल हो रही है (या कम से कम यह उस समय थी stat())।

हालाँकि अगर यह गलत है (या यदि सही है [ ! -f "$file" ]या नहीं ! [ -f "$file" ]), तो कई अलग संभावनाएं हैं:

  • फ़ाइल मौजूद नहीं है
  • फ़ाइल मौजूद है, लेकिन एक नियमित फ़ाइल नहीं है (एक उपकरण, फिफो, निर्देशिका, सॉकेट हो सकता है ...)
  • फ़ाइल मौजूद है, लेकिन आपके पास मूल निर्देशिका के लिए खोज अनुमति नहीं है
  • फ़ाइल मौजूद है, लेकिन इसे एक्सेस करने का रास्ता बहुत लंबा है
  • फ़ाइल एक नियमित फ़ाइल के लिए एक सिम्लिंक है, लेकिन आपके पास सिम्लिंक के रिज़ॉल्यूशन में शामिल कुछ निर्देशिकाओं की खोज अनुमति नहीं है।
  • ... किसी अन्य कारण से stat()सिस्टम कॉल विफल हो सकता है।

संक्षेप में, यह होना चाहिए:

if [ -f "$file" ]; then
  printf '"%s" is a path to a regular file or symlink to regular file\n' "$file"
elif [ -e "$file" ]; then
  printf '"%s" exists but is not a regular file\n' "$file"
elif [ -L "$file" ]; then
  printf '"%s" exists, is a symlink but I cannot tell if it eventually resolves to an actual file, regular or not\n' "$file"
else
  printf 'I cannot tell if "%s" exists, let alone whether it is a regular file or not\n' "$file"
fi

यह सुनिश्चित करने के लिए कि फ़ाइल मौजूद नहीं है, हमें stat()एक त्रुटि कोड के साथ लौटने के लिए सिस्टम कॉल की आवश्यकता होगी ENOENT( ENOTDIRहमें बताता है कि पथ घटकों में से एक एक निर्देशिका नहीं है एक और मामला है जहां हम बता सकते हैं कि फ़ाइल नहीं है उस रास्ते से मौजूद है)। दुर्भाग्य से[ कमांड हमें यह नहीं बताती है। यह गलत होगा कि क्या त्रुटि कोड ENOENT, EACCESS (अनुमति अस्वीकृत), ENAMETOOLONG या कुछ और है।

[ -e "$file" ]परीक्षण भी किया जा सकता है ls -Ld -- "$file" > /dev/null। उस स्थिति में, lsआपको बताएगा कि stat()असफल क्यों हुआ , हालांकि जानकारी को आसानी से प्रोग्रामेटिक रूप से उपयोग नहीं किया जा सकता है:

$ file=/var/spool/cron/crontabs/root
$ if [ ! -e "$file" ]; then echo does not exist; fi
does not exist
$ if ! ls -Ld -- "$file" > /dev/null; then echo stat failed; fi
ls: cannot access '/var/spool/cron/crontabs/root': Permission denied
stat failed

कम से कम lsमुझे बताता है कि यह नहीं है क्योंकि फ़ाइल मौजूद नहीं है कि यह विफल रहता है। यह इसलिए है क्योंकि यह नहीं बता सकता है कि फ़ाइल मौजूद है या नहीं। [आदेश सिर्फ समस्या पर ध्यान नहीं दिया।

zshशेल के साथ , आप $ERRNOविफलता कोड के बाद विशेष चर के साथ त्रुटि कोड को क्वेरी कर सकते हैं [, और मॉड्यूल $errnosमें विशेष सरणी का उपयोग करके उस संख्या को डिकोड कर सकते हैं zsh/system:

zmodload zsh/system
ERRNO=0
if [ ! -f "$file" ]; then
  err=$ERRNO
  case $errnos[err] in
    ("") echo exists, not a regular file;;
    (ENOENT|ENOTDIR)
       if [ -L "$file" ]; then
         echo broken link
       else
         echo does not exist
       fi;;
    (*) syserror -p "can't tell: " "$err"
  esac
fi

( जब हाल के संस्करणों के साथ बनाया $errnosगया था तो कुछ संस्करणों के साथ समर्थन टूट गया थाzshgcc )।


11

एक परीक्षण को उलटने के लिए, "!" का उपयोग करें। यह अन्य भाषाओं में "नहीं" तार्किक ऑपरेटर के बराबर है। इसे इस्तेमाल करे:

if [ ! -f /tmp/foo.txt ];
then
    echo "File not found!"
fi

या थोड़ा अलग तरीके से लिखा गया है:

if [ ! -f /tmp/foo.txt ]
    then echo "File not found!"
fi

या आप उपयोग कर सकते हैं:

if ! [ -f /tmp/foo.txt ]
    then echo "File not found!"
fi

या, सभी को एक साथ प्रस्तुत करना:

if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi

जो लिखा जा सकता है (तब ("और" ऑपरेटर: &&) के रूप में):

[ ! -f /tmp/foo.txt ] && echo "File not found!"

जो इस तरह छोटा दिखता है:

[ -f /tmp/foo.txt ] || echo "File not found!"


10

यह कोड भी काम कर रहा है।

#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
 echo "File '$FILE' Exists"
else
 echo "The File '$FILE' Does Not Exist"
fi

7

सबसे सरल तरीका

FILE=$1
[ ! -e "${FILE}" ] && echo "does not exist" || echo "exists"

6

यह शेल स्क्रिप्ट डायरेक्टरी में फाइल खोजने के लिए भी काम करती है:

echo "enter file"

read -r a

if [ -s /home/trainee02/"$a" ]
then
    echo "yes. file is there."
else
    echo "sorry. file is not there."
fi

3
यह स्पष्ट नहीं है कि यह कुछ भी जोड़ता है जो अन्य उत्तर पहले से नहीं दिया है। यह एक पाथ-कोड को हार्ड-कोड करता है। चूँकि प्रश्न बैश को टैग किया जाता है , इसलिए यह read -p "Enter file name: " -r aपढ़ने के साथ-साथ संकेत देने के लिए भी उपयोग हो सकता है । यह चर के आसपास उद्धरणों का उपयोग करता है; यह अच्छा है, लेकिन समझाया जाना चाहिए। यह बेहतर होगा अगर यह फ़ाइल नाम गूँजता है। और यह जांचता है कि फ़ाइल मौजूद है या खाली नहीं है (इसका अर्थ है -s) जबकि सवाल किसी भी फाइल के बारे में पूछता है, खाली है या नहीं (जिसके -fलिए अधिक उपयुक्त है)।
जोनाथन लेफ्लर 21

4

कभी-कभी इसका उपयोग करना आसान हो सकता है && और || ऑपरेटरों।

जैसे (यदि आपके पास "परीक्षण" कमांड है):

test -b $FILE && echo File not there!

या

test -b $FILE || echo File there!

2

यदि आप testइसके बजाय उपयोग करना चाहते हैं [], तो आप !नकार पाने के लिए उपयोग कर सकते हैं :

if ! test "$FILE"; then
  echo "does not exist"
fi

0

आप एक लाइनर में कई कमांड को भी ग्रुप कर सकते हैं

[ -f "filename" ] || ( echo test1 && echo test2 && echo test3 )

या

[ -f "filename" ] || { echo test1 && echo test2 && echo test3 ;}

यदि फ़ाइल नाम से बाहर नहीं निकला, तो आउटपुट होगा

test1
test2
test3

नोट: (...) एक उपधारा में चलता है, {...;} उसी शेल में चलता है। घुंघराले ब्रैकेट नोटेशन केवल बैश में काम करता है।


1
नहीं, घुंघराले ब्रैकेट संकेतन केवल बैश नहीं है ; यह किसी भी POSIX- अनुरूप शेल में काम करता है।
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.