Perintah tunggal untuk memeriksa apakah file ada, dan mencetak pesan (kustom) ke stdout?


18

Semoga tidak apa-apa untuk mencatat ini, sekarang saya sudah menemukannya:

Saya sudah mengetahui bahwa seseorang dapat menguji keberadaan file menggunakan perintah 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

... tapi itu sedikit mengetik di sana. :)Jadi, saya berkeliaran jika ada perintah tunggal "default", yang akan mengembalikan hasil keberadaan file stdout?

Saya juga dapat menggunakan testdengan status keluar $?:

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

... tapi ini masih dua perintah - dan logikanya juga "terbalik" (0 untuk sukses, dan bukan nol untuk kegagalan).

Alasan saya bertanya adalah bahwa saya perlu menguji keberadaan file gnuplot, yang " system("command")mengembalikan aliran karakter yang dihasilkan dari stdout sebagai string. "; di gnuplotsaya bisa lakukan langsung:

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

jadi pada dasarnya saya ingin dapat menulis sesuatu seperti ini (semu):

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

... sayangnya, saya tidak bisa menggunakannya secara langsung melalui testdan $?:

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

... Saya harus membalikkan logika.

Jadi, pada dasarnya saya harus membuat semacam solusi skrip khusus (atau menulis skrip inline sebagai one-liner) ... dan saya pikir, jika sudah ada perintah default yang dapat mencetak 0 atau 1 (atau pesan khusus) ke stdout untuk keberadaan file, maka saya tidak perlu melakukannya :)

(perhatikan bahwa lsmungkin seorang kandidat, tetapi keluarannya terlalu bertele-tele; dan jika saya ingin menghindarinya, saya harus menekan semua keluaran dan kembali mengembalikan status yang ada, seperti pada

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

... tapi itu lagi dua perintah (dan lebih banyak mengetik), dan "terbalik" logika ...)

Jadi, adakah satu perintah standar yang dapat melakukan ini di Linux?


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

Jawaban:


9

Kedengarannya Anda perlu status keluar dibalik, sehingga Anda bisa melakukan:

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

atau:

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

(perhatikan itu -funtuk apakah file ada dan merupakan file biasa ).


5

Gunakan perintah bash tunggal ini:

 [ -f /home/user/file_name ]

Melakukan []tes dan mengembalikan 0 pada keberhasilan


3
tidak mengembalikan apa pun jika kedua kasus - CentOS
amfibi

1
Berfungsi bagus di macOS.
Joshua Pinter

1
Anda dapat menggunakan ini untuk menjalankan perintah secara kondisional dengan &&dan ||operator: [ -f /home/user/file_name ] || echo "File not present"dan juga[ -f /home/user/file_name ] && echo "File is present"
charlesreid1

1
@ charlesreid1 yang melakukan pekerjaan, terima kasih!
Marta Karas

1

Bagaimana dengan "membalikkan logika" oleh:

file_exists = 1-system("test -f exists.file; echo $?")

-1

Ini bekerja:

pwsh -c Test-Path /etc/passwd

... jika Anda telah menginstal PowerShell. Ia mengembalikan string "Benar", jika jalur ada, atau "Salah" jika tidak. (Apakah saya mendapatkan poin "sarkastis tidak membantu" untuk jawaban ini?)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.