Существует ли команда для отображения сообщения «Да», если существует определенный файл? Нет необходимости предоставлять функциональность, если файл не существует.
Используйте эту простую остроту Bash:
if [ -e FILENAME ] ; then echo Yes ; fi
Эти -e
проверка оценивает к истинному, если FILENAME
существует, независимо от того, что это (файл, каталог, ссылка, устройство...).
, Если Вы только хотите проверить регулярные файлы, используйте -f
вместо этого, как сказанный @Arronical.
Можно использовать этот простой сценарий:
#!/bin/bash
if [[ -f $1 ]]; then
echo "Yes"
exit 0
else
exit 1
fi
Сохраните его как file-exists.sh
. Затем в Терминале ввести chmod +x file-exists.sh
.
Используйте его как: ./file-exists.sh FILE
где Вы заменяете FILE
с файлом Вы хотите проверить, например:
./file-exists.sh file.txt
Если file.txt
существует, Yes
будет распечатан к Терминалу, и программа выйдет с состоянием 0 (успех). Если файл не будет существовать, то ничто не будет распечатано, и программа выйдет с состоянием 1 (отказ).
Если Вам любопытно, почему я включал exit
команда, продолжает читать...
exit
команда?exit
вызывает нормальное завершение процесса. То, что это означает, в основном: это останавливает сценарий. Это принимает дополнительный (числовой) параметр, который будет статусом выхода сценария, который назвал его.
Этот статус выхода позволяет Вашим другим сценариям использовать Ваш file-exists
сценарий и является их способом знать, что файл существует или нет.
Простым примером, который вводит это в эксплуатацию, является этот сценарий (сохраните его как file-exists-cli.sh
):
#!/bin/bash
echo "Enter a filename and I will tell you if it exists or not: "
read FILE
# Run `file-exists.sh` but discard any output because we don't need it in this example
./file-exists.sh $FILE &>> /dev/null
# #? is a special variable that holds the exit status of the previous command
if [[ $? == 0 ]]; then
echo "$FILE exists"
else
echo "$FILE does not exist"
fi
Сделайте обычное chmod +x file-exists-cli.sh
и затем выполненный это: ./file-exists-cli.sh
. Вы будете видеть что-то вроде этого:
Файл существует (exit 0
):
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
booleans.py
booleans.py exists
Файл не существует (exit 1
):
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
asdf
asdf does not exist
Самая короткая команда для того, чтобы сделать, что Вы хотите:
test -e FILENAME && echo Yes
test -e
протестирует, существует ли данное имя в файловой системе. (Можно использовать test -f
ограничить регулярными файлами только. Посмотрите man test
для больше.)
Если данное условие оценивает к истинному, то test
возвращает успешный статус выхода (иначе, он возвращает состояние отказа). Мы комбинируем два использования команд &&
, что означает, "выполняют следующую команду если предыдущая команда, из которой выходят с состоянием успеха". Следующая команда просто печатает Yes
на стандартном выводе; в случае интерактивной оболочки, на терминале.
Это избегает дополнительного текстового материала if
оператор, все же дает тот же результат. Используя &&
(или его противоположное, ||
) связывать команды вместе работает хорошо, когда только единственная команда включена. Если Вы хотите сделать больше, чем выполняют единственную команду в ответ на статус выхода единственной команды, то использование if
синтаксис быстро становится намного более читаемым.
Как уже говорилось в других ответах, эквиваленте if
конструкция стиля была бы:
if test -e FILENAME; then echo Yes; fi
или альтернативно:
if test -e FILENAME
then
echo Yes
fi
В этих целях, [
и test
эквивалентны, за исключением того, что [
требует завершения ]
.
В ударе окружают на командной строке.
if [[ -f /path/to/file ]]; then echo "Yes"; fi
Это использует условный оператор удара -f
и проверяет, существует ли файл и является регулярным файлом. Если Вы хотите протестировать на какие-либо файлы включая каталоги, и ссылки затем используют -e
.
Очищать этот тип вопроса там - несколько путей и здесь - другой: использовать find
команда с -exec
флаг. Путь к файлу может быть разделен на две части find /etc
который устанавливает каталог и -name FILENAME
который указывает имя файла (понятное дело!). -maxdepth
сохранит find
работа с /etc
каталог только и не будет убывать в подкаталоги
adminx@L455D:~$ find /etc -maxdepth 1 -name passwd -exec printf "YES\n" \;
YES
adminx@L455D:~$ find /etc -maxdepth 1 -name passwd1 -exec printf "YES\n" \;
adminx@L455D:~$
Иначе, через stat
:
adminx@L455D:~$ stat /etc/passwd1 &>/dev/null && echo YES
adminx@L455D:~$ stat /etc/passwd &>/dev/null && echo YES
YES
И альтернативно с помощью Python:
>>> import os
>>> if os.stat('/etc/passwd'):
... print 'YES'
...
YES
>>> if os.stat('/etc/passwd1'):
... print 'YES'
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/etc/passwd1'
Или короткая альтернатива командной строки:
python -c "from os.path import exists; print 'Yes' if exists('/etc/fstab') else '' "