Jak poprawnie sprawdzić, czy plik istnieje w Bash lub Shell (z przykładami)
Spis treści
W tym samouczku omówię różne atrybuty, których możesz użyć w skryptach basha lub powłoki, aby sprawdzić pliki i katalogi. Możesz użyć wyrażeń warunkowych basha z ]
lub użyć testu z , aby sprawdzić, czy plik istnieje.
Będziemy używać operatora bash if i else we wszystkich przykładach, więc polecam przeczytać: Bash if else przewodnik użytkowania dla absolutnie początkujących
1. Bash / Shell: Sprawdź, czy plik istnieje i jest zwykłym plikiem
Ta sekcja pokazuje przykłady sprawdzania, czy w bash istnieje zwykły plik.
1.1: Metoda-1: Używanie pojedynczych lub podwójnych nawiasów
Używanie podwójnych nawiasów ]
#!/bin/bashFILE="/etc/passwd"if ];then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
Używanie pojedynczych nawiasów
#!/bin/bashFILE="/etc/passwd"if ;then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
1.2: Metoda-2: Używanie polecenia testowego
test
służy do sprawdzania typów plików i porównywania wartości.
#!/bin/bashFILE="/etc/passwd"if test -f $FILE; then echo "$FILE exists"else echo "$FILE missing"fi
1.3: Metoda-3: Pojedyncza linia
W tym przykładzie możemy użyć pojedynczych lub podwójnych nawiasów. Zalecałbym, aby zawsze używać podwójnych nawiasów, kiedy piszesz jeden kod liniowy w powłoce, ponieważ minimalizuje to ryzyko uzyskania ostrzeżeń na konsoli, gdy ma miejsce podział na słowa.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists" || echo "$FILE missing"
Instrukcja po &&
zostanie wykonana, jeśli SUKCES. Jeśli pierwszy warunek zwróci FALSE, to instrukcja z ||
zostanie wykonana.
Podobnie używając polecenia test, aby sprawdzić, czy zwykły plik istnieje w skrypcie bash lub powłoki w jednej linii .
#!/bin/bashFILE="/etc/passwd"test -f $FILE && echo "$FILE exists" || echo "$FILE missing"
2. Bash / Shell: Sprawdź, czy plik istnieje (jest pusty lub niepusty)
Aby sprawdzić, czy plik istnieje a jeśli jest pusty lub zawiera jakąś treść, używamy atrybutu „-s
”
2.1: Metoda 1: Używanie pojedynczych lub podwójnych nawiasów
Sprawdź, czy plik istnieje i czy jest pusty, czy nie, używając podwójnych nawiasów kwadratowych ]
#!/bin/bashFILE="/etc/passwd"if ]; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
Sprawdź, czy plik istnieje i jest puste lub nie jest puste przy użyciu podwójnych nawiasów
if ; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
2.2: Metoda-2: Używanie polecenia testowego
Używając polecenia testowego łączymy atrybut -s
, aby sprawdzić, czy plik istnieje i jest pusty lub zawiera jakąś zawartość:
2.3: Metoda 3: Pojedyncza linia
Możemy użyć podwójnych lub pojedynczych nawiasów dla takiej jednej linijki, ale jak powiedziałem wcześniej, polecam użycie podwójnych nawiasów.
#!/bin/bashFILE="/etc/passwd"test -s $FILE && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
Podobnie z poleceniem testowym możemy użyć &&
i ||
operator, aby sprawdzić plik za pomocą polecenia jednowierszowego w naszym skrypcie powłoki.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
3. Bash / Shell: Sprawdź, czy katalog istnieje
Mam nadzieję, że wiesz, że w Linuksie wszystko jest plikiem. W ten sposób katalog jest również traktowany jako plik. Możemy użyć atrybutu „-d
„, aby sprawdzić, czy katalog istnieje w programowaniu powłoki.
3.1: Metoda 1: Używanie podwójnych lub pojedynczych nawiasów
Możemy użyć atrybutu -d
w pojedynczym lub w podwójnych nawiasach
]
, aby sprawdzić jeśli katalog istnieje.
#!/bin/bashDIR="/var/log"if ]; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
Podobnie używamy pojedynczych nawiasów w tym przykładzie, aby sprawdzić, czy katalog jest wstępnie ustawiony w skrypcie powłoki.
#!/bin/bashDIR="/var/log"if ; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.2: Metoda-2: Używanie polecenia testowego
W tym przykładzie użyjemy polecenia test, aby upewnić się, czy katalog jest obecny, czy nie, zanim wykonamy określone zadanie.
#!/bin/bashDIR="/var/log"if test -d $DIR; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.3: Metoda-3: Pojedyncza linia
W tym przykładzie użyjemy pojedynczych i podwójnych nawiasów w postaci pojedynczej linii do sprawdzenia dla katalogu. Instrukcja po operatorze &&
zostanie wykonana, jeśli pierwszy warunek ma wartość TRUE, a jeśli jest FALSE, zostanie wykonana instrukcja ||
warunku .
#!/bin/bashDIR="/var/log"] && echo "$DIR exists" || echo "$DIR doesn"t exist"
Zalecałbym używanie ]
zamiast dla takich kodów liniowych w programowaniu powłoki.
Podobnie z &&
i ||
możemy użyć polecenia test, aby sprawdzić jeśli katalog istnieje
#!/bin/bashDIR="/var/log"test -d $DIR && echo "$DIR exists" || echo "$DIR doesn"t exist"
4. Bash / Shell: Sprawdź, czy katalog istnieje (pusty lub niepusty)
Nie ma atrybutów powłoki jak to wykorzystałem we wszystkich innych przykładach i scenariuszach w tym samouczku, ale mamy kilka hacków, których możemy użyć do sprawdzenia, czy katalog jest pusty, czy niepusty.
4.1: Metoda-1: Wyświetl zawartość katalogu i zweryfikuj
W tym przykładzie wymienimy zawartość katalogu, pominiemy dane wyjściowe, a następnie na podstawie kodu zakończenia sprawdź, czy katalog jest pusty lub zawiera content
#!/bin/bashDIR="/tmp"if ls -1qA $DIR | grep -q . ; then echo "$DIR is not -empty"else echo "$DIR is empty"fi
Możemy to również odwrócić, umieszczając warunek NOT (!
). Wyglądałoby to następująco:
#!/bin/bashDIR="/tmp"if ! ls -1qA $DIR | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
Wynik byłby taki sam w obu przykładowych skryptach.
4.2: Metoda-2: Używanie polecenie find
Możemy użyć polecenia find, a następnie wyłączyć wyjście, aby sprawdzić, czy katalog docelowy zawiera jakąś zawartość, czy nie.
#!/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: Wypisz zawartość
Ponownie, jak powiedziałem, ponieważ nie ma łatwego sposobu sprawdzenia, czy katalog jest pusty lub nie używa niektórych atrybutów, wypiszemy zawartość katalogu. Jeśli nie otrzymasz żadnych wyników, katalog jest pusty lub niepusty
#!/bin/bashDIR="/tmp"if ] ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
5. Bash / Shell: Lista atrybutów do testowania pliku
Podobnie istnieje wiele innych atrybutów, których można używać ze skryptami powłoki do sprawdzania różnych typów plików, takich jak dowiązania symboliczne, uprawnienia do plików itp.
Atrybuty | Co robi? |
---|---|
-a FILE |
Prawda, jeśli FILE istnieje |
-b FILE |
Prawda, jeśli FILE istnieje i jest blokowym plikiem specjalnym. |
-c FILE |
Prawda, jeśli FILE istnieje i jest specjalnym plikiem znaków. |
-d FILE |
Prawda, jeśli FILE istnieje i jest katalogiem. |
Prawda, jeśli FILE istnieje |
|
-f FILE |
Prawda, jeśli FILE istnieje i jest zwykłym plikiem |
-g FILE |
Prawda, jeśli FILE istnieje i jego bit set-group-id jest ustawiony |
-h FILE |
Prawda, jeśli FILE istnieje i jest dowiązaniem symbolicznym |
-k FILE |
Prawda, jeśli FILE istnieje i jego bit „sticky” jest ustawiony |
-p FILE |
Prawda, jeśli FILE istnieje i jest nazwana potok (FIFO) |
-r FILE |
Prawda, jeśli FILE istnieje i można go odczytać |
-s FILE |
Prawda, jeśli FILE istnieje i ma rozmiar większy niż zero |
-u FILE |
Prawda, jeśli FILE istnieje i jego bit set-user-id jest ustawiony |
-w FILE |
Prawda, jeśli FILE istnieje i jest zapisywalna |
-x FILE |
Prawda, jeśli FILE istnieje i jest wykonywalne |
-G FILE |
Prawda, jeśli FILE istnieje i należy do efektywnego identyfikatora grupy |
-L FILE |
Prawda, jeśli FILE istnieje i jest dowiązaniem symbolicznym |
-N FILE |
Prawda, jeśli FILE istnieje i został zmodyfikowany od czasu ostatniego odczytu |
-o FILE |
Prawda, jeśli FILE istnieje i jest własnością efektywnego identyfikator użytkownika |
-S FILE |
Prawda, jeśli FILE istnieje i jest gniazdem |
|
Prawda, jeśli FILE1 i FILE2 odnoszą się do tego samego urządzenia i numery i-węzłów |
FILE1 -nt FILE2 |
Prawda, jeśli FILE1 jest nowszy (zgodnie z datą modyfikacji) niż FILE2 lub jeśli FILE1 istnieje i FILE2 istnieje nie |
FILE1 -ot FILE2 |
Prawda, jeśli FILE1 jest starszy niż FILE2 lub jeśli FILE2 istnieje, a FILE1 nie |