คำสั่งเดียวเพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่และพิมพ์ข้อความ (กำหนดเอง) ไปที่ stdout?


18

หวังว่ามันจะโอเคที่จะทราบสิ่งนี้ตอนนี้ที่ฉันได้พบมัน:

ฉันทราบอยู่แล้วว่าสามารถทดสอบการมีอยู่ของไฟล์โดยใช้คำสั่ง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

... แต่มันพิมพ์นิดหน่อยตรง:)นั้นฉันเลยหลงทางถ้ามีคำสั่งเดียว "ปริยาย" ที่จะคืนค่าการมีอยู่ของไฟล์ให้stdout?

ฉันยังสามารถใช้testกับสถานะออก$?:

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

... แต่นี่ยังคงเป็นสองคำสั่ง - และตรรกะก็เป็น "สิ่งที่ตรงกันข้าม" (0 สำหรับความสำเร็จและไม่ใช่ศูนย์สำหรับความล้มเหลว)

เหตุผลที่ฉันถามคือฉันต้องทดสอบการมีอยู่ของไฟล์gnuplotซึ่ง " system("command")ส่งคืนสตรีมอักขระที่เป็นผลลัพธ์จาก stdout เป็นสตริง "; ในgnuplotฉันสามารถทำโดยตรง:

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

ดังนั้นโดยทั่วไปฉันต้องการที่จะสามารถเขียนสิ่งนี้ (หลอก):

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

... น่าเสียดายที่ผมไม่สามารถใช้โดยตรงผ่านทางtestและ$?:

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

... ฉันต้องกลับเหตุผล

ดังนั้นโดยทั่วไปฉันต้องคิดวิธีแก้ไขสคริปต์แบบกำหนดเอง (หรือเขียนสคริปต์แบบอินไลน์เป็นหนึ่งซับ) ... และฉันคิดว่าถ้ามีคำสั่งเริ่มต้นที่สามารถพิมพ์ 0 หรือ 1 (หรือ ข้อความที่กำหนดเอง) เพื่อ stdout สำหรับการมีอยู่ของไฟล์จากนั้นฉันไม่ต้องทำ :)

(โปรดทราบว่าlsอาจเป็นตัวเลือก แต่เอาต์พุต stdout นั้นละเอียดเกินไปและถ้าฉันต้องการหลีกเลี่ยงสิ่งนั้นฉันจะต้องระงับเอาต์พุตทั้งหมดและกลับสถานะที่มีอยู่อีกครั้งดังเช่นใน

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

... แต่นั่นเป็นอีกสองคำสั่ง (และการพิมพ์ที่มากขึ้น) และตรรกะ "inverted" ... )

ดังนั้นมีคำสั่งเริ่มต้นเดียวที่สามารถทำได้ใน Linux?


2
แล้วไง( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"ล่ะ
iruvar

คำตอบ:


9

ดูเหมือนว่าคุณต้องการสถานะการออกกลับด้านดังนั้นคุณสามารถทำได้:

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

หรือ:

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

(โปรดทราบว่าใช้-fสำหรับหากมีไฟล์อยู่และเป็นไฟล์ปกติ )


5

ใช้คำสั่ง bash เดียวนี้:

 [ -f /home/user/file_name ]

[]ดำเนินการทดสอบและผลตอบแทน 0 ในความสำเร็จ


3
จะไม่ส่งคืนสิ่งใดถ้า CentOS
สะเทินน้ำสะเทินบก

1
ใช้งานได้ดีบน macOS
Joshua Pinter

1
คุณสามารถใช้สิ่งนี้เพื่อเรียกใช้คำสั่งแบบมีเงื่อนไขกับ&&และ||โอเปอเรเตอร์: [ -f /home/user/file_name ] || echo "File not present"และ[ -f /home/user/file_name ] && echo "File is present"
charlesreid1

1
@ คนหนึ่งของ charlesreid1 ทำงานได้ดีขอบคุณ!
Marta Karas

1

สิ่งที่เกี่ยวกับ "การพลิกกลับตรรกะ" โดย:

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

-1

งานนี้:

pwsh -c Test-Path /etc/passwd

... หากคุณติดตั้ง PowerShell มันจะส่งกลับทั้งสตริง "True" หากเส้นทางที่มีอยู่หรือ "เท็จ" ถ้ามันไม่ (ฉันจะได้คะแนน "แดกดันไม่ช่วยเหลือ" สำหรับคำตอบนี้หรือไม่?)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.