Intereting Posts
Зашифровать файл и уничтожить все незашифрованные копии «Ошибка чтения диска» при запуске Windows после обновления Ubuntu + Восстановление загрузки Ubuntu 16.04 Драйвер NVidia работает до перезагрузки Как заблокировать facebook Что делать, если в моем государстве / стране нет команды Ubuntu LoCo? Как я могу начать? Как установить filezilla? Как предотвратить обновление Firefox для каждой версии приложения (предпочтения вне папки профиля)? Juju на AWS t1.micro (или другие) зарезервированные экземпляры Существуют ли какие-либо темы GTK3, которые работают правильно в Unity-2D? Все, что я пробовал, имеет «кнопки глюков», Ubuntu (15.10, 16.04, 16.10) зависает от возобновления с приостановки (только на батарее) Проблемы с установкой Ardupilot (14.04) Главная папка в `root`, а не` home` … Я в замешательстве! Где находится «PTBatcher» в Ubuntu 16.04? Как включить IPv6 через miredo вместе с UFW? Firefox минимизирует использование «Всегда в видимой рабочей области» на двойном мониторе hdmi

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

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

Используйте этот простой однострочный Bash:

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

Параметр -e проверяет значение true, если существует 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 

В оболочке bash в командной строке.

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

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

Это отличный ресурс для условностей bash.

Самая короткая команда для выполнения того, что вы хотите:

 test -e FILENAME && echo Yes 

test -e проверяет, существует ли указанное имя в файловой системе. (Вы можете использовать test -f для ограничения только обычных файлов. См. man test for more.)

Если заданное условие оценивается как 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 '' "