Отдельная команда, чтобы проверить, существует ли файл, и распечатать (настраиваемое) сообщение на стандартный вывод?

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?

sdaau
источник
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 в случае успеха

YaronE
источник
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 один делает работу, спасибо!
Марта Карас
1

Как насчет "инвертирования логики" путем:

file_exists = 1-system("test -f exists.file; echo $?")
user33734
источник
-1

Это работает:

pwsh -c Test-Path /etc/passwd

... если у вас установлен PowerShell. Он возвращает либо строку «True», если путь существует, либо «False», если его нет. (Получаю ли я «саркастически бесполезные» баллы за этот ответ?)

Тодд уолтон
источник