Vraag Hoe weet ik of een standaardbestand niet bestaat in Bash?


Ik heb het volgende script gebruikt om te zien of een bestand bestaat:

#!/bin/bash

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

Wat is de juiste syntaxis om te gebruiken als ik alleen wil controleren of het bestand dat wel doet niet bestaan?

#!/bin/bash

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

2507
2018-03-12 14:48


oorsprong


antwoorden:


De test commando ([ hier) heeft een "niet" logische operator die het uitroepteken is (vergelijkbaar met veel andere talen). Probeer dit:

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

3520
2018-03-12 14:50



Bash File Testing

-b filename - Speciaal bestand blokkeren
-c filename - Speciaal tekenbestand
-d directoryname - Controleer of het adresboek bestaat
-e filename - Controleer of het bestand bestaat, ongeacht het type (knooppunt, directory, socket, etc.)
-f filename - Controleer of het bestaand bestand bestaat en niet een map
-G filename - Controleer of bestand bestaat en eigendom is van effectieve groeps-ID
-G filename set-group-id - Waar als bestand bestaat en is ingesteld-groeps-ID
-k filename - Sticky beetje
-L filename - Symbolische link
-O filename - Waar als het bestand bestaat en eigendom is van het effectieve gebruikers-ID
-r filename - Controleer of het bestand leesbaar is
-S filename - Controleer of bestand socket is
-s filename - Controleer of het bestand niet-nul is
-u filename - Controleer of bestand ingesteld-gebruiker-ID-bit is ingesteld
-w filename - Controleer of bestand schrijfbaar is
-x filename - Controleer of bestand uitvoerbaar is

Hoe te gebruiken:

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

EEN test uitdrukking kan worden genegeerd door de ! operator

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

427
2018-01-16 14:25



Je kunt een expressie negeren met "!":

#!/bin/bash
FILE=$1

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

De relevante manpagina is man test of, equivalent, man [ - of help test of help [ voor de ingebouwde bash-opdracht.


250
2018-03-12 14:50



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

Het is ook mogelijk dat het bestand een verbroken symbolische koppeling is, of een niet-regulier bestand, zoals b.v. een socket, apparaat of fifo. Bijvoorbeeld om een ​​controle toe te voegen voor kapotte symlinks:

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

110
2018-03-12 14:52



Het is de moeite waard om te vermelden dat als u één enkele opdracht moet uitvoeren, u deze kunt afkorten

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

naar

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

of

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

80
2017-08-11 09:15



Ik geef de voorkeur aan de volgende one-liner, in POSIX shell compatibel formaat:

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

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

Voor een paar commando's, zoals ik zou doen in een script:

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

Zodra ik dit begon te doen, gebruik ik zelden de volledig getypte syntaxis !!


56
2017-10-18 16:09



Om het bestaan ​​van een bestand te testen, kan de parameter een van de volgende zijn:

-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

Alle onderstaande tests zijn van toepassing op reguliere bestanden, directory's en symlinks:

-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

Voorbeeld script:

#!/bin/bash
FILE=$1

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

36
2017-12-19 12:47



Je moet voorzichtig zijn met hardlopen test voor een niet-genoteerde variabele, omdat dit onverwachte resultaten kan opleveren:

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

De aanbeveling is meestal om de geteste variabele te laten omgeven door dubbele aanhalingstekens:

#!/bin/sh
FILE=$1

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

28
2018-01-24 19:43



Er zijn drie verschillende manieren om dit te doen:

  1. Negeer de uitgangsstatus met bash (geen ander antwoord heeft dit gezegd):

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

    Of:

    ! [ -e "$file" ] && echo "file does not exist"
    
  2. Negeer de test binnen het testcommando [ (zo hebben de meeste antwoorden eerder gepresenteerd):

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

    Of:

    [ ! -e "$file" ] && echo "file does not exist"
    
  3. Handelen over het resultaat van de test die negatief is (|| in plaats van &&):

    Enkel en alleen:

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

    Dit ziet er dom uit (IMO), gebruik het niet tenzij je code draagbaar moet zijn naar de Bourne shell (zoals de /bin/sh van Solaris 10 of eerder) waarbij de exploitant van de pipeline-negatie ontbrak (!):

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

18
2017-08-05 18:10



Je kan dit doen:

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

of

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

Als u beide bestanden en mappen wilt controleren, gebruikt u -eoptie in plaats van -f. -e geeft true terug voor reguliere bestanden, mappen, socket, speciale tekens voor tekens, speciale bestanden blokkeren enz.


14
2018-04-28 19:40