Lệnh đơn để kiểm tra xem tệp có tồn tại không và in thông báo (tùy chỉnh) sang thiết bị xuất chuẩn?


18

Hy vọng sẽ ổn khi lưu ý điều này, bây giờ tôi đã gặp phải nó:

Tôi đã biết rằng người ta có thể kiểm tra sự tồn tại của tệp bằng lệnh 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

... nhưng đó là một chút gõ ở đó :)Vì vậy, tôi đã đi lang thang nếu có một lệnh "mặc định", điều đó sẽ trả về kết quả tồn tại của tệp stdout?

Tôi cũng có thể sử dụng testvới trạng thái thoát $?:

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

... nhưng đây vẫn là hai lệnh - và logic cũng là "nghịch đảo" (0 cho thành công và khác không cho thất bại).

Lý do tôi hỏi là tôi cần kiểm tra sự tồn tại của tệp gnuplot, trong đó " system("command")trả về luồng ký tự kết quả từ thiết bị xuất chuẩn dưới dạng chuỗi. "; trong gnuplottôi có thể làm trực tiếp:

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

Vì vậy, về cơ bản tôi muốn có thể viết một cái gì đó như thế này (giả):

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

... thật không may, tôi không thể sử dụng trực tiếp qua test$?:

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

... Tôi phải đảo ngược logic.

Vì vậy, về cơ bản, tôi phải đưa ra một giải pháp tập lệnh tùy chỉnh (hoặc viết một tập lệnh nội tuyến dưới dạng một lớp) ... và tôi nghĩ, nếu đã có một lệnh mặc định có thể in 0 hoặc 1 (hoặc một thông báo tùy chỉnh) để xuất bản cho sự tồn tại của tệp, sau đó tôi không phải làm như vậy :)

(lưu ý rằng lscó thể là một ứng cử viên, nhưng đầu ra xuất sắc của nó quá dài dòng và nếu tôi muốn tránh điều đó, tôi phải loại bỏ tất cả đầu ra và một lần nữa trả lại trạng thái tồn tại, như trong

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

... nhưng đó lại là hai lệnh (và gõ nhiều hơn) và logic "đảo ngược" ...)

Vì vậy, có một lệnh mặc định duy nhất có thể làm điều này trong Linux không?


2
làm thế nào về ( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"?
iruvar

Câu trả lời:


9

Âm thanh như bạn cần đảo ngược trạng thái thoát, vì vậy bạn có thể làm:

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

hoặc là:

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

(lưu ý rằng -fnếu tập tin tồn tại và là một tập tin bình thường ).


5

Sử dụng lệnh bash duy nhất này:

 [ -f /home/user/file_name ]

Việc []thực hiện kiểm tra và trả về 0 khi thành công


3
không trả lại bất cứ điều gì nếu một trong hai trường hợp - CentOS
lưỡng cư

1
Hoạt động tuyệt vời trên macOS.
Joshua Pinter

1
Bạn có thể sử dụng để chạy các lệnh có điều kiện với các &&||các nhà khai thác: [ -f /home/user/file_name ] || echo "File not present"và cũng[ -f /home/user/file_name ] && echo "File is present"
charlesreid1

1
@ charlesreid1 là một trong những công việc, cảm ơn!
Marta Karas

1

Điều gì về "đảo ngược logic" bằng cách:

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

-1

Những công việc này:

pwsh -c Test-Path /etc/passwd

... nếu bạn đã cài đặt PowerShell. Nó trả về chuỗi "Đúng", nếu đường dẫn tồn tại hoặc "Sai" nếu không có. (Tôi có nhận được điểm "không có ích" cho câu trả lời này không?)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.