Jedno polecenie, aby sprawdzić, czy plik istnieje i wydrukować (niestandardowy) komunikat na standardowe wyjście?


18

Mam nadzieję, że dobrze jest to zanotować, skoro już się z tym spotkałem:

Wiem już, że można przetestować istnienie pliku za pomocą polecenia test( [):

$ touch exists.file
$ if [ -f exists.file ] ; then echo "yes" ; else echo "no" ; fi
yes
$ if [ -f noexists.file ] ; then echo "yes" ; else echo "no" ; fi
no

... ale to trochę tam pisać :)Więc wędrowałem, czy istnieje "domyślne" pojedyncze polecenie, które zwróci wynik istnienia pliku stdout?

Mogę również użyć testze statusem wyjścia $?:

$ test -f exists.file ; echo $?
0
$ test -f noexists.file ; echo $?
1

... ale wciąż są to dwa polecenia - a logika jest również „odwrotna” (0 dla sukcesu, a niezerowa dla niepowodzenia).

Powodem, dla którego pytam, jest to, że muszę przetestować istnienie pliku gnuplot, którego „ system("command")zwraca wynikowy strumień znaków ze standardowego wyjścia jako ciąg. ”; w gnuplotmogę zrobić bezpośrednio:

gnuplot> if (0) { print "yes" } else { print "no" }
no
gnuplot> if (1) { print "yes" } else { print "no" }
yes

więc zasadniczo chciałbym móc napisać coś takiego (pseudo):

gnuplot> file_exists = system("check_file --stdout exists.file")
gnuplot> if (file_exists)  { print "yes" } else { print "no" }
yes

... niestety, nie mogę używać, bezpośrednio poprzez testi $?:

gnuplot> file_exists = system("test -f exists.file; echo $?")
gnuplot> if (file_exists)  { print "yes" } else { print "no" }
no

... musiałbym odwrócić logikę.

Więc w zasadzie musiałbym wymyślić coś w rodzaju niestandardowego rozwiązania skryptu (lub napisać skrypt w jednym wierszu) ... i pomyślałem, że jeśli jest już domyślne polecenie, które może wypisać 0 lub 1 (lub niestandardowy komunikat) na standardowe wyjście dla istnienia pliku, wtedy nie muszę tego robić :)

(zwróć uwagę, że lsmoże to być kandydat, ale jego wyjście standardowe jest zdecydowanie zbyt szczegółowe; a jeśli chcę tego uniknąć, musiałbym stłumić wszystkie dane wyjściowe i ponownie zwrócić status istnienia, jak w

$ ls exists.file 1>/dev/null 2>/dev/null ; echo $? 
0
$ ls noexists.file 1>/dev/null 2>/dev/null ; echo $? 
2

... ale to znowu dwa polecenia (i więcej pisania) i logika „odwrócona” ...)

Czy istnieje więc jedna domyślna komenda, która może to zrobić w systemie Linux?


2
jak o ( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"?
iruvar

Odpowiedzi:


9

Wygląda na to, że potrzebujesz odwrócić status wyjścia, więc możesz:

system("[ ! -e file ]; echo $?")

lub:

system("[ -e file ]; echo $((!$?))")

(uwaga -fjest taka, jeśli plik istnieje i jest zwykłym plikiem ).


5

Użyj tego pojedynczego polecenia bash:

 [ -f /home/user/file_name ]

[]Wykonać test i zwraca 0 w przypadku powodzenia


3
nic nie zwraca, jeśli którykolwiek z przypadków - CentOS
amfibia

1
Działa świetnie na macOS.
Joshua Pinter

1
Można to wykorzystać do uruchamiania poleceń z warunkowo &&i ||operatorów: [ -f /home/user/file_name ] || echo "File not present"a także[ -f /home/user/file_name ] && echo "File is present"
charlesreid1

1
@ charlesreid1's wykonuje pracę, dzięki!
Marta Karas


-1

To działa:

pwsh -c Test-Path /etc/passwd

... jeśli masz zainstalowany PowerShell. Zwraca albo ciąg „True”, jeśli ścieżka istnieje, albo „False”, jeśli nie istnieje. (Czy dostaję „sarkastycznie nieprzydatne” punkty za tę odpowiedź?)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.