Jak správně zkontrolovat, zda soubor existuje v Bash nebo Shell (s příklady)
Obsah
V tomto tutoriálu se budu zabývat různými atributy, které můžete použít při skriptování bash nebo shell pro kontrolu souborů a adresářů. Můžete použít podmíněné výrazy bash s ]
nebo použít test s a zkontrolovat, zda soubor existuje.
Budeme používejte operátor bash if and else pro všechny příklady, takže bych vám doporučil přečíst: Bash if else průvodce používáním pro úplné začátečníky
1. Bash / Shell: Zkontrolujte, zda soubor existuje a je běžným souborem
V této části jsou uvedeny příklady ke kontrole, zda v bash existuje běžný soubor.
1.1: Metoda 1: Použití jednoduchých nebo dvojitých závorek
Použití dvojitých závorek ]
#!/bin/bashFILE="/etc/passwd"if ];then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
Použití jednotlivých závorek
#!/bin/bashFILE="/etc/passwd"if ;then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
1.2: Metoda 2: Použití příkazu test
test
se používá ke kontrole typů souborů a porovnání hodnoty.
#!/bin/bashFILE="/etc/passwd"if test -f $FILE; then echo "$FILE exists"else echo "$FILE missing"fi
1.3: Metoda-3: Jeden řádek
V tomto příkladu zde můžeme použít jednoduché nebo dvojité závorky. Doporučuji vždy používat dvojité závorky, když píšete jeden linerový kód do shellu, protože to minimalizuje riziko upozornění na konzoli, když dojde k rozdělení slov.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists" || echo "$FILE missing"
Příkaz po &&
bude proveden, pokud ÚSPĚCH. Pokud první podmínka vrátí NEPRAVDA, bude proveden příkaz s ||
.
Podobně pomocí testovacího příkazu zkontrolujte, zda existuje normální soubor v bash nebo shell skriptu v jednom řádku .
#!/bin/bashFILE="/etc/passwd"test -f $FILE && echo "$FILE exists" || echo "$FILE missing"
2. Bash / Shell: Zkontrolovat, zda soubor existuje (je prázdný nebo není prázdný)
Zkontrolovat, zda soubor existuje a pokud je prázdný nebo má nějaký obsah, použijeme atribut „-s
“
2.1: Metoda 1: Použití jednoduchých nebo dvojitých závorek
Zkontrolujte, zda soubor existuje a je prázdný nebo není prázdný, pomocí dvojitých závorek ]
#!/bin/bashFILE="/etc/passwd"if ]; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
Zkontrolujte, zda soubor existuje a je prázdný nebo není prázdný pomocí dvojitých závorek
if ; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
2.2: Metoda 2: Použití testovacího příkazu
Pomocí testovacího příkazu kombinujeme atribut -s
a zkontrolujeme, zda soubor existuje a je prázdný nebo má nějaký obsah:
2.3: Metoda-3: Jednořádkový
Pro takovou liner můžeme použít dvojité nebo jednoduché závorky, ale jak jsem již řekl, doporučil bych použít dvojité závorky.
#!/bin/bashFILE="/etc/passwd"test -s $FILE && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
Podobně jako u testovacího příkazu můžeme použít &&
a ||
operátor zkontrolovat soubor v jednom řádku příkazu uvnitř našeho skriptu prostředí.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
3. Bash / Shell: Zkontrolovat, zda adresář existuje
Doufám, že víte, že v Linuxu je všechno soubor. Tímto způsobem se tedy adresář považuje také za soubor. Pomocí atributu „-d
“ můžeme zkontrolovat, zda v programování prostředí existuje adresář.
3.1: Metoda 1: Použití dvojitých nebo jednoduchých závorek
Ke kontrole můžeme použít atribut -d
v jedné nebo dvojitých závorkách
]
pokud adresář existuje.
#!/bin/bashDIR="/var/log"if ]; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
Podobně používáme v tomto příkladu jednotlivé závorky ke kontrole, zda je adresář přednastaven ve skriptu prostředí.
#!/bin/bashDIR="/var/log"if ; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.2: Metoda 2: Použití testovacího příkazu
V tomto příkladu použijeme testovací příkaz, abychom se ujistili, zda je adresář přítomen nebo ne, než provedeme určitou úlohu.
#!/bin/bashDIR="/var/log"if test -d $DIR; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.3: Metoda-3: Jednořádkový
V tomto příkladu použijeme ke kontrole jednoduchou a dvojitou závorku ve formě jednoho řádku pro adresář. Příkaz po operátoru &&
bude proveden, pokud je první podmínka TRUE a pokud je NEPRAVDA, bude proveden příkaz ||
podmínky .
#!/bin/bashDIR="/var/log"] && echo "$DIR exists" || echo "$DIR doesn"t exist"
Doporučil bych použít ]
místo pro takové kódy liniové linky v programování prostředí.
Podobně jako u &&
a ||
můžeme použít testovací příkaz ke kontrole pokud adresář existuje
#!/bin/bashDIR="/var/log"test -d $DIR && echo "$DIR exists" || echo "$DIR doesn"t exist"
4. Bash / Shell: Zkontrolujte, zda adresář existuje (prázdný nebo není prázdný)
Neexistují žádné atributy shellu jak jsem použil ve všech ostatních příkladech a scénářích v tomto výukovém programu. Máme ale několik hacků, pomocí kterých můžeme zkontrolovat, zda je adresář prázdný nebo ne-prázdný.
4.1: Metoda-1: Seznam obsahu adresáře a ověření
V tomto příkladu uvedeme obsah adresáře, potlačíme výstup a poté na základě kódu ukončení zkontrolujeme, zda je adresář prázdný nebo obsahuje nějaké content
#!/bin/bashDIR="/tmp"if ls -1qA $DIR | grep -q . ; then echo "$DIR is not -empty"else echo "$DIR is empty"fi
Můžeme to také zvrátit uvedením podmínky NOT (!
). Vypadalo by to takto:
#!/bin/bashDIR="/tmp"if ! ls -1qA $DIR | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
Výstup by byl stejný v obou příkladech skriptů.
4.2: Metoda 2: Použití příkaz find
Můžeme použít příkaz find a poté potlačit výstup a zkontrolovat, zda má cílový adresář nějaký obsah.
#!/bin/bashDIR="/tmp"if find -- "$DIR" -prune -type d -empty | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
4.3: Metoda 3: Seznam obsahu
Znovu, jak jsem již řekl, protože neexistuje snadný způsob, jak zkontrolovat, zda je adresář prázdný nebo zda nepoužívá některé atributy, vypíšeme obsah adresáře. Pokud nedostanete žádný výstup, pak je adresář prázdný nebo jinak není prázdný.
#!/bin/bashDIR="/tmp"if ] ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
5. Bash / Shell: Seznam atributů testovaného souboru
Podobně existuje mnoho dalších atributů, které můžete pomocí skriptů prostředí použít ke kontrole různých typů souborů, například symbolické odkazy, oprávnění souborů atd.
Atributy | Co dělá? |
---|---|
-a FILE |
Pravda, pokud FILE existuje |
-b FILE |
Pravda, pokud FILE existuje a jedná se o speciální blokový soubor. |
-c FILE |
True if FILE existuje a je to speciální znakový soubor. |
-d FILE |
True if FILE existuje a je adresářem. |
Pravda, pokud FILE existuje |
|
-f FILE |
True, pokud FILE existuje a je běžným souborem |
-g FILE |
True, pokud existuje FILE a je nastaven jeho bit set-group-id |
-h FILE |
Pravda, pokud FILE existuje a je symbolickým odkazem |
-k FILE |
Pravda, pokud FILE existuje a je nastaven jeho „lepkavý“ bit |
-p FILE |
Pravda, pokud FILE existuje a je pojmenovaná roura (FIFO) |
-r FILE |
True if FILE existuje a je čitelný |
-s FILE |
True if FILE existuje a má velikost větší než nula |
-u FILE |
True, pokud FILE existuje a je nastaven jeho bit set-user-id |
-w FILE |
True, pokud FILE existuje a je zapisovatelný |
-x FILE |
True, pokud FILE existuje a je spustitelný |
-G FILE |
Pravda, pokud FILE existuje a je vlastněna účinným ID skupiny |
-L FILE |
Pravda, pokud FILE existuje a je symbolickým odkazem |
-N FILE |
Pravda, pokud FILE existuje a byl od posledního čtení změněn |
-o FILE |
Pravda, pokud FILE existuje a je ve vlastnictví efektivní ID uživatele |
-S FILE |
Pravda, pokud FILE existuje a je soket |
|
True, pokud FILE1 a FILE2 odkazují na stejné zařízení a čísla inode |
FILE1 -nt FILE2 |
True, pokud FILE1 je novější (podle data úpravy) než FILE2 , nebo pokud FILE1 existuje a FILE2 ano ne |
FILE1 -ot FILE2 |
pravda, pokud je FILE1 starší než FILE2 , nebo pokud FILE2 existuje a FILE1 není |