Czy istnieje polecenie wyświetlania komunikatu „Tak”, jeśli istnieje konkretny plik? Nie ma potrzeby udostępniania funkcjonalności, jeśli plik nie istnieje.
command-line
James
źródło
źródło
[ -e FILENAME ] && echo Yes
FILENAME
jest zmiennym rozszerzeniem lub zawiera znaki specjalne, nie zapomnij go zacytować. np w skrypcie[ -e "$1" ] && echo Yes
.[[
i]]
zamiast cytować zmienną.[[ ]]
, zawsze cytowanie jest dobrym nawykiem dla początkujących, którzy nie pamiętają specjalnych zasad dotyczących[[ ]]
operatora lub kontekstów arytmetycznych.Możesz użyć tego prostego skryptu:
Zapisz to jako
file-exists.sh
. Następnie w Terminalu wpiszchmod +x file-exists.sh
.Użyj go w następujący sposób:
./file-exists.sh FILE
gdzie zamieniaszFILE
na plik, który chcesz sprawdzić, na przykład:Jeśli
file.txt
istnieje,Yes
zostanie wydrukowany na terminalu, a program zakończy pracę ze statusem 0 (sukces). Jeśli plik nie istnieje, nic nie zostanie wydrukowane, a program zakończy pracę ze statusem 1 (błąd).Jeśli jesteś ciekawy, dlaczego zawarłem
exit
polecenie, czytaj dalej ...Co jest z
exit
poleceniem?exit
powoduje normalne zakończenie procesu. Oznacza to w zasadzie: zatrzymuje skrypt. Akceptuje opcjonalny (numeryczny) parametr, który będzie statusem wyjścia skryptu, który go wywołał.Ten status wyjścia umożliwia innym skryptom korzystanie ze
file-exists
skryptu i jest sposobem na poznanie, czy plik istnieje, czy nie.Prostym przykładem, który wykorzystuje to, jest ten skrypt (zapisz go jako
file-exists-cli.sh
):Czy zwykły
chmod +x file-exists-cli.sh
, a następnie uruchomić go:./file-exists-cli.sh
. Zobaczysz coś takiego:Plik istnieje (
exit 0
):Plik nie istnieje (
exit 1
):źródło
"$1"
. Jeśli ma w nim białe znaki, łamie się bez cudzysłowów i mogą się zdarzyć inne złe rzeczy.W powłoce bash w wierszu poleceń.
Korzysta z operatora warunkowego bash
-f
i sprawdza, czy plik istnieje i czy jest zwykłym plikiem. Jeśli chcesz przetestować pliki, w tym katalogi i łącza, użyj-e
.To świetny zasób dla warunkowych bashów.
źródło
test
oryginalnego formatu, wiem, że to przesada, ale to mój zwyczaj.[
polecenia, które zwykle wywołuje funkcję wbudowaną). Korygują niespójności i głupie zachowania wersji z pojedynczym nawiasiem klamrowym. [Wbudowane pozostaje dla kompatybilności, ale nie widzę żadnego dobrego powodu, aby używać go w nowym kodzie bash. (Jeśli musisz pisać skrypty zgodne z POSIX, które mogą działać na starożytnych powłokach lub coś w tym stylu, to jest inne.)[
zwykle nazywa się wbudowanym” jest wątpliwa.type -a [
dla mnie lista „wbudowana powłoka”, a następnie „/usr/bin/[
.”type
wyniki wydają się potwierdzać to, co powiedziałem, nie?Najkrótsze polecenie do robienia tego, co chcesz, to:
test -e
sprawdzi, czy podana nazwa istnieje w systemie plików. (Możesz użyć,test -f
aby ograniczyć się tylko do zwykłych plików. Zobaczman test
więcej.)Jeśli podany warunek ma wartość true, wówczas
test
zwraca pomyślny status wyjścia (w przeciwnym razie zwraca status błędu). Łączymy oba polecenia za pomocą&&
, co oznacza „wykonaj następne polecenie, jeśli poprzednie polecenie zakończyło się powodzeniem”. Następne polecenie po prostu drukujeYes
na standardowym wyjściu; w przypadku interaktywnej powłoki na terminalu.Pozwala to uniknąć dodatkowego materiału tekstowego
if
instrukcji, ale daje ten sam rezultat. Użycie&&
(lub jego przeciwieństwo||
) do powiązania poleceń działa dobrze, gdy zaangażowane jest tylko jedno polecenie. Jeśli chcesz zrobić więcej niż wykonanie pojedynczego polecenia w odpowiedzi na status wyjścia pojedynczego polecenia, wówczas użycieif
składni szybko staje się znacznie bardziej czytelne.Jak już wskazano w innych odpowiedziach, odpowiednikiem
if
stylu będzie:lub alternatywnie:
Do tych celów
[
itest
są równoważne, z wyjątkiem tego, że[
wymaga zakończenia]
.źródło
Aby skorygować tego typu pytanie, istnieje wiele sposobów, a oto inny: użyj
find
polecenia z-exec
flagą. Ścieżkę do pliku można podzielić na dwie części,find /etc
które ustawiają katalog i-name FILENAME
określają nazwę pliku (duh!).-maxdepth
będzie nadalfind
pracował/etc
tylko z katalogiem i nie będzie schodził do podkatalogówInnym sposobem jest
stat
:I alternatywnie przez python:
Lub alternatywa dla krótkiej linii poleceń:
źródło