Одна команда, щоб перевірити, чи існує файл, і роздрукувати (користувацьке) повідомлення для 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

... але це знову дві команди (і більше набору тексту) та "перевернута" логіка ...)

Отже, чи є одна команда за замовчуванням, яка може це зробити в 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.
Джошуа Пінтер

1
Ви можете використовувати цю функцію для виконання команд умовно з &&і ||операторами: [ -f /home/user/file_name ] || echo "File not present"а також[ -f /home/user/file_name ] && echo "File is present"
charlesreid1

1
@ charlesreid1 's один робить роботу, дякую!
Марта Карась

1

Як щодо "інвертування логіки" шляхом:

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

-1

Це працює:

pwsh -c Test-Path /etc/passwd

... якщо у вас встановлено PowerShell. Він повертає або рядок "True", якщо шлях існує, або "False", якщо його немає. (Чи отримую я "саркастично недоброзичливі" бали за цю відповідь?)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.