GNU/Linux >> Znalost Linux >  >> Linux

Jak zkontrolovat, zda existuje soubor nebo adresář v Bash

Mnohokrát se při psaní skriptů Shell můžete dostat do situace, kdy potřebujete provést akci podle toho, zda soubor existuje či nikoli.

V Bash můžete pomocí příkazu test zkontrolovat, zda soubor existuje, a určit typ souboru.

Příkaz test má jednu z následujících forem syntaxe:

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

Pokud chcete, aby byl váš skript přenosný, měli byste raději použít starý test [ příkaz, který je dostupný ve všech shellech POSIX. Nová upgradovaná verze testovacího příkazu [[ (dvojité závorky) je podporována na většině moderních systémů používajících Bash, Zsh a Ksh jako výchozí prostředí.

Zkontrolovat, zda soubor existuje #

Při kontrole, zda soubor existuje, jsou nejběžněji používané operátory FILE -e a -f . První zkontroluje, zda soubor existuje bez ohledu na typ, zatímco druhý vrátí true pouze v případě, že SOUBOR je běžný soubor (ne adresář nebo zařízení).

Nejčitelnější možností při kontrole, zda soubor existuje nebo ne, je použít test příkaz v kombinaci s if prohlášení. Kterýkoli z níže uvedených úryvků zkontroluje, zda /etc/resolv.conf soubor existuje:

FILE=/etc/resolv.conf
if test -f "$FILE"; then
    echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE exists."
fi
FILE=/etc/resolv.conf
if [[ -f "$FILE" ]]; then
    echo "$FILE exists."
fi

Pokud chcete provést jinou akci podle toho, zda soubor existuje nebo ne, jednoduše použijte konstrukci if/then:

FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE exists."
else 
    echo "$FILE does not exist."
fi
Vždy používejte dvojité uvozovky, abyste se vyhnuli problémům při práci se soubory obsahujícími mezery v názvech.

Příkaz test můžete použít i bez příkazu if. Příkaz za && Operátor bude proveden pouze v případě, že výstupní stav příkazu testu je pravdivý,

test -f /etc/resolv.conf && echo "$FILE exists."
[ -f /etc/resolv.conf ] && echo "$FILE exists."
[[ -f /etc/resolv.conf ]] && echo "$FILE exists."

Pokud chcete spustit řadu příkazů za && operátor jednoduše uzavře příkazy do složených závorek oddělených ; nebo && :

[ -f /etc/resolv.conf ] && { echo "$FILE exist."; cp "$FILE" /tmp/; }

Na rozdíl od && , příkaz za || Operátor bude proveden pouze v případě, že stav ukončení testovacího příkazu je false .

[ -f /etc/resolv.conf ] && echo "$FILE exist." || echo "$FILE does not exist."

Zkontrolujte, zda adresář existuje #

Operátory -d umožňuje otestovat, zda je soubor adresářem nebo ne.

Například zkontrolovat, zda /etc/docker adresář existuje, který byste použili:

FILE=/etc/docker
if [ -d "$FILE" ]; then
    echo "$FILE is a directory."
fi
[ -d /etc/docker ] && echo "$FILE is a directory."

Můžete také použít dvojité závorky [[ místo jednoho [ .

Zkontrolovat, zda soubor neexistuje #

Podobně jako v mnoha jiných jazycích lze testovací výraz negovat pomocí ! (vykřičník) logický ne operátor:

FILE=/etc/docker
if [ ! -f "$FILE" ]; then
    echo "$FILE does not exist."
fi

Stejné jako výše:

[ ! -f /etc/docker ] && echo "$FILE does not exist."

Zkontrolovat, zda existuje více souborů #

Místo použití složitých vnořených konstrukcí if/else můžete použít -a (nebo && s [[ ) pro testování, zda existuje více souborů:

if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
    echo "Both files exist."
fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then
    echo "Both files exist."
fi

Ekvivalentní varianty bez použití příkazu IF:

[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."

Operátory testu souborů #

Příkaz test obsahuje následující operátory FILE, které vám umožňují testovat konkrétní typy souborů:

  • -b FILE - True, pokud FILE existuje a jedná se o speciální blokový soubor.
  • -c FILE - True, pokud SOUBOR existuje a jde o soubor se speciálními znaky.
  • -d FILE - True, pokud SOUBOR existuje a jedná se o adresář.
  • -e FILE - True, pokud FILE existuje a je souborem, bez ohledu na typ (uzel, adresář, soket atd.).
  • -f FILE - True, pokud FILE existuje a je to běžný soubor (nikoli adresář nebo zařízení).
  • -G FILE - True, pokud FILE existuje a má stejnou skupinu jako uživatel spouštějící příkaz.
  • -h FILE - True, pokud SOUBOR existuje a je symbolickým odkazem.
  • -g FILE - True, pokud FILE existuje a má set-group-id (sgid ) sada příznaků.
  • -k FILE - True, pokud FILE existuje a má nastaven příznak lepivého bitu.
  • -L FILE - True, pokud SOUBOR existuje a je symbolickým odkazem.
  • -O FILE - True, pokud SOUBOR existuje a je ve vlastnictví uživatele spouštějícího příkaz.
  • -p FILE - True, pokud FILE existuje a je roura.
  • -r FILE - True, pokud SOUBOR existuje a je čitelný.
  • -S FILE - True, pokud FILE existuje a je to soket.
  • -s FILE - True, pokud SOUBOR existuje a má nenulovou velikost.
  • -u FILE - True, pokud FILE existuje, a set-user-id (suid ) je nastaven příznak.
  • -w FILE - True, pokud SOUBOR existuje a je možné do něj zapisovat.
  • -x FILE - True, pokud SOUBOR existuje a je spustitelný.

Závěr č.

V této příručce jsme vám ukázali, jak zkontrolovat, zda soubor nebo adresář v Bash existuje.

Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.


Linux
  1. Jak zkontrolovat průběh běhu Cp?

  2. Jak zkontrolovat podřetězec v Shell Script Bash?

  3. Jak mohu zkontrolovat, zda soubor existuje, a provést příkaz, pokud ne?

  1. Zkontrolujte, zda v adresáři existuje určitý typ souboru/přípona

  2. Jak analyzovat soubor CSV v Bash?

  3. Jak zkontrolovat syslog v Bash na Linuxu?

  1. Jak zkontrolovat, zda je soubor prázdný v Bash?

  2. Jak mohu zkontrolovat, zda adresář existuje?

  3. Jak získám absolutní adresář souboru v bash?