Команда для отображения произвольного сообщения, если конкретный файл существует

Существует ли команда для отображения сообщения «Да», если существует определенный файл? Нет необходимости предоставлять функциональность, если файл не существует.

11
задан 16 June 2016 в 04:09

5 ответов

Используйте эту простую остроту Bash:

if [ -e FILENAME ] ; then echo Yes ; fi

Эти -e проверка оценивает к истинному, если FILENAME существует, независимо от того, что это (файл, каталог, ссылка, устройство...).

, Если Вы только хотите проверить регулярные файлы, используйте -f вместо этого, как сказанный @Arronical.

25
ответ дан 16 June 2016 в 04:09

Можно использовать этот простой сценарий:

#!/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
10
ответ дан 16 June 2016 в 04:09

Самая короткая команда для того, чтобы сделать, что Вы хотите:

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 эквивалентны, за исключением того, что [ требует завершения ].

5
ответ дан 16 June 2016 в 04:09

В ударе окружают на командной строке.

if [[ -f /path/to/file ]]; then echo "Yes"; fi

Это использует условный оператор удара -f и проверяет, существует ли файл и является регулярным файлом. Если Вы хотите протестировать на какие-либо файлы включая каталоги, и ссылки затем используют -e.

Это - большой ресурс для условных выражений удара.

9
ответ дан 16 June 2016 в 04:09

Очищать этот тип вопроса там - несколько путей и здесь - другой: использовать 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 '' "
4
ответ дан 16 June 2016 в 04:09

Другие вопросы по тегам:

Похожие вопросы: