Dosyanın olup olmadığını kontrol etmek için tek komut ve stdout'a (özel) mesaj yazdırmak için?


18

Umarım bunu not etmeliyim, şimdi karşılaştım:

Zaten bir test( [) komutunu kullanarak dosya varlığını test edebilirsiniz farkındayım :

$ 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

... ama oraya yazmak biraz :)öyle Yani, "varsayılan" tek bir komut varsa dolaşmak oldu, bu dosya varlığı sonucunu döndürür stdout?

Ben de testçıkış durumu ile kullanabilirsiniz $?:

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

... ancak bu hala iki komuttur - ve mantık da "ters" dir (başarı için 0 ve başarısızlık için sıfır olmayan).

Sormamın nedeni, dosya varlığını test etmem gerektiğidir gnuplot, bu da " system("command")elde edilen karakter akışını stdout'tan bir dize olarak döndürür "; içinde gnuplotdoğrudan yapabilirsiniz:

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

temelde böyle bir şey yazmak istiyorum istiyorum (sözde):

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

... ne yazık ki, bunu doğrudan testve aracılığıyla kullanamıyorum $?:

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

... mantığı tersine çevirmem gerekecekti.

Yani, temelde özel bir komut dosyası çözümü (ya da tek satırlık bir satır içi komut dosyası yazma) ile gelmek zorundayım ... ve 0 veya 1 yazdırabilecek varsayılan bir komut varsa (veya özel bir mesaj) dosya varlığı için stdout, o zaman bunu yapmak zorunda değilim :)

( lsbunun bir aday olabileceğini unutmayın , ancak stdout çıktısı çok ayrıntılı; ve bundan kaçınmak istersem, tüm çıktıları bastırmam ve var olan durumu tekrar döndürmem gerekir

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

... ama bu yine iki komut (ve daha fazla yazma) ve "ters çevrilmiş" mantık ...)

Peki, bunu Linux'ta yapabilen tek bir varsayılan komut var mı?


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

Yanıtlar:


9

Çıkış durumunun tersine çevrilmesi gerektiği gibi geliyor, böylece şunları yapabilirsiniz:

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

veya:

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

(not -fiçindir dosya varsa ve düzenli bir dosyadır ).


5

Bu tek bash komutunu kullanın:

 [ -f /home/user/file_name ]

[]Başarısına testi ve getiri 0 gerçekleştirmek


3
her iki durumda da hiçbir şey döndürmez - CentOS
amphibient 17:18

1
MacOS üzerinde harika çalışıyor.
Joshua Pinter

1
Komutları &&ve ||operatörleriyle koşullu olarak çalıştırmak için bunu kullanabilirsiniz : [ -f /home/user/file_name ] || echo "File not present"ve ayrıca[ -f /home/user/file_name ] && echo "File is present"
charlesreid1

1
@ charlesreid1 'den biri işi yapıyor, teşekkürler!
Marta Karas

1

"Mantığı tersine çevirme":

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

-1

Bu çalışıyor:

pwsh -c Test-Path /etc/passwd

... PowerShell yüklüyse. Yol varsa "True" dizesini veya yoksa "False" dizesini döndürür. (Bu cevap için "alaycı yararsız" puanlar alabilir miyim?)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.