Есть ли команда для отображения сообщения «Да», если существует конкретный файл? Не нужно давать функциональность, если файл не существует.
Вы можете использовать этот простой скрипт:
#!/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 вызывает нормальное завершение процесса. Это означает, в основном: он останавливает скрипт. Он принимает необязательный (числовой) параметр, который будет статусом выхода скрипта, который его вызвал.
Этот статус выхода позволяет другим скриптам использовать ваш скрипт 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 0):
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
asdf
asdf does not exist
В оболочке bash в командной строке.
if [[ -f /path/to/file ]]; then echo "Yes"; fi
Это использует условный оператор bash -f и проверяет, существует ли файл и является обычным файлом. Если вы хотите протестировать любые файлы, включая каталоги и ссылки, используйте -e.
Это отличный ресурс для условных условных обозначений bash.
Самая короткая команда для выполнения того, что вы хотите:
test -e FILENAME && echo Yes
test -e будет проверять, существует ли указанное имя в файловой системе. (Вы можете использовать test -f для ограничения только обычных файлов. Подробнее см. [F6].)
Если заданное условие оценивается как true, то test возвращает успешный статус выхода (в противном случае он возвращает статус отказа). Мы объединяем две команды, используя &&, что означает «выполнить следующую команду, если предыдущая команда вышла с состоянием успеха». Следующая команда просто печатает Yes на стандартном выходе; в случае интерактивной оболочки на терминале.
Это позволяет избежать дополнительного текстового материала инструкции if, но дает тот же результат. Использование && (или его противоположность ||) для объединения команд вместе хорошо работает, когда задействована только одна команда. Если вы хотите сделать больше, чем выполнить одну команду в ответ на статус выхода одной команды, то синтаксис if быстро станет более читаемым.
Как уже указывалось в других ответах, эквивалент Конструкция стиля if будет:
if test -e FILENAME; then echo Yes; fi
или альтернативно:
if test -e FILENAME
then
echo Yes
fi
Для этих целей [ и test эквивалентны, за исключением того, что [ требует окончания ].
Чтобы задать этот тип вопроса, существует несколько способов, и вот еще один: используйте команду find с флагом -exec. Путь к файлу можно разбить на две части find /etc, которая устанавливает каталог и -name FILENAME, который указывает имя файла (duh!). -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 '' "