यदि एक नियमित रूप से फ़ाइल बैश में मौजूद नहीं है मैं कैसे बता सकता हूं?

वोट
2k

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

#!/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
12/03/2009 को 15:48
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


19 जवाब

वोट
3k

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

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi
12/03/2009 को 15:50
का स्रोत उपयोगकर्ता

वोट
393

बैश फ़ाइल परीक्षण

-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 
16/01/2014 को 15:25
का स्रोत उपयोगकर्ता

वोट
246

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

#!/bin/bash
FILE=$1

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

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

12/03/2009 को 15:50
का स्रोत उपयोगकर्ता

वोट
107
[[ -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
12/03/2009 को 15:52
का स्रोत उपयोगकर्ता

वोट
79

यह उल्लेख है कि आप को संक्षिप्त कर सकते हैं यदि आप एक ही आदेश पर अमल करने की जरूरत है लायक है

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

सेवा मेरे

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

या

[ -f "$file" ] || echo "$file"
11/08/2011 को 10:15
का स्रोत उपयोगकर्ता

वोट
55

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

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

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

आदेशों की एक जोड़ी के लिए, जैसे मैं एक स्क्रिप्ट में करना होगा:

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

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

18/10/2011 को 17:09
का स्रोत उपयोगकर्ता

वोट
35

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

-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
19/12/2013 को 13:47
का स्रोत उपयोगकर्ता

वोट
28

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

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

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

#!/bin/sh
FILE=$1

if [ ! -f "$FILE" ]
then
   echo "File $FILE does not exist."
fi
24/01/2012 को 20:43
का स्रोत उपयोगकर्ता

वोट
17

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

  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कि पाइपलाइन निषेध ऑपरेटर का अभाव (Solaris 10 या इससे पहले की) !):

    if [ -e "$file" ]; then
        :
    else
        echo "file does not exist"
    fi
    
05/08/2015 को 18:10
का स्रोत उपयोगकर्ता

वोट
11

में

[ -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;;
    (*) echo "can't tell"; syserror "$err"
  esac
fi

(सावधान रहना $errnosसमर्थन के कुछ संस्करणों के साथ टूट गया है zshजब के हाल के संस्करणों के साथ बनाया गयाgcc )।

14/10/2016 को 15:18
का स्रोत उपयोगकर्ता

वोट
11

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

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

या

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

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

28/04/2015 को 19:40
का स्रोत उपयोगकर्ता

वोट
7

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

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

या, सब एक साथ presing:

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!"
04/05/2013 को 23:29
का स्रोत उपयोगकर्ता

वोट
7

testबात भी माना जा सकता है। यह मेरे लिए काम किया (के आधार पर बैश शेल: चेक फ़ाइल है या नहीं ):

test -e FILENAME && echo "File exists" || echo "File doesn't exist"
31/03/2013 को 14:22
का स्रोत उपयोगकर्ता

वोट
6

इस कोड को भी काम कर रहे।

#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
 echo "File '$FILE' Exists"
else
 echo "The File '$FILE' Does Not Exist"
fi
03/07/2015 को 08:39
का स्रोत उपयोगकर्ता

वोट
4

सबसे आसान तरीका

FILE=$1
[ ! -e "${FILE}" ] && echo "does not exist" || echo "exists"
21/05/2014 को 07:11
का स्रोत उपयोगकर्ता

वोट
2

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

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
29/08/2013 को 07:59
का स्रोत उपयोगकर्ता

वोट
1

कभी कभी इसका इस्तेमाल करने && और आसान हो सकता है || ऑपरेटरों।

में तरह (अगर आपके पास आदेश "परीक्षण"):

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

या

test -b $FILE || echo File there!
11/04/2017 को 20:25
का स्रोत उपयोगकर्ता

वोट
0

आप "परीक्षण" का उपयोग करने के बजाय "[]" है, तो आप उपयोग कर सकते हैं चाहते हैं "!" निषेध पाने के लिए: if ! test "$FILE"; then echo "does not exist" fi

27/08/2019 को 22:45
का स्रोत उपयोगकर्ता

वोट
0

आप कर सकते हैं एक लाइनर में भी समूह से कई आदेशों

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

या

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

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

test1
test2
test3

नोट: (...) एक subshell में चलता है, {...;} एक ही खोल में चलाता है। धनुषाकार कोष्ठक अंकन केवल बैश में काम करता है।

12/06/2019 को 14:50
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more