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?

sdaau
źródło
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 ).

Stéphane Chazelas
źródło
5

Użyj tego pojedynczego polecenia bash:

 [ -f /home/user/file_name ]

[]Wykonać test i zwraca 0 w przypadku powodzenia

YaronE
źródło
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

Co z „odwróceniem logiki” przez:

file_exists = 1-system("test -f exists.file; echo $?")
użytkownik33734
źródło
-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ź?)

Todd Walton
źródło