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

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

1
задан 15 June 2016 в 18:09

4 ответа

Вы можете использовать этот простой скрипт:

#!/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? [ ! d6]

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

10
ответ дан 23 May 2018 в 09:20
  • 1
    Хорошо, но цитируйте переменные, например "$1". Если в нем есть пробел, он будет разорваться без кавычек, и могут произойти другие плохие вещи. – Joe 16 June 2016 в 01:33

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

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

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

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

9
ответ дан 23 May 2018 в 09:20
  • 1
    Почему двойные брекеты? – Byte Commander 14 June 2016 в 20:05
  • 2
    Я не поклонник test в оригинальном формате, я знаю, что это слишком много, но это моя привычка. – Arronical 14 June 2016 в 20:07
  • 3
    @ByteCommander: двойные скобки обычно лучше, чем отдельные фигурные скобки. Они являются частью синтаксиса оболочки (вместо вызова команды [, которая обычно вызывает встроенную функцию.) Они исправляют несогласованности и тупое поведение версии одной скобки. [Builtin остается совместимым, но я не вижу причин для его использования в новом коде bash. (Если вам нужно написать POSIX-совместимые скрипты, которые могут запускаться на древних оболочках или что-то в этом роде). – kundor 14 June 2016 в 22:13
  • 4
    @kundor: В основном согласился, однако, чтобы быть справедливым, «[ обычно называет« встроенный ». сомнительно. type -a [ для меня списки "shell builtin", затем "/usr/bin/[." – wchargin 16 June 2016 в 03:37
  • 5
    @wchargin: Боюсь, я не понимаю, к чему вы клоните. Ваши результаты type, похоже, подтверждают то, что я сказал, нет? – kundor 16 June 2016 в 07:27

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

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

5
ответ дан 23 May 2018 в 09:20

Чтобы задать этот тип вопроса, существует несколько способов, и вот еще один: используйте команду 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 '' "
4
ответ дан 23 May 2018 в 09:20

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

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