Как проверить наличие файла или символической ссылки, даже сломанной, в Bash? - PullRequest
0 голосов
/ 27 марта 2020

В Bash я хочу сказать «если ~/.gitconfig существует, сделать что-то» , но возникли проблемы с правильным условием. Мне нужно учитывать простые файлы, действительные символические ссылки и битые символические ссылки.

То, что я пробовал, не работает:

  • if [[ -L "$HOME/.gitconfig" ]] - возвращает false, когда .gitconfig является обычный файл.
  • if [[ -e "$HOME/.gitconfig" ]] - возвращает ложь, если .gitconfig существует, но сломана символическая ссылка.

Есть ли переключатель, который может делать то, что я хочу, или мне нужно придумать более сложное условие?

ОБНОВЛЕНИЕ : я удалил упоминание об удалении файлов, меня интересует только условие, а не действия, которые происходят после этого .

Ответы [ 3 ]

2 голосов
/ 27 марта 2020

Это условие делает то, что мне нужно (хотя я все же предпочел бы один переключатель / тест, если он существует):

file="$HOME/.gitconfig"

if [[ -e $file || -L $file ]]; then
  echo "File exists"
fi
0 голосов
/ 27 марта 2020

Возможно, ссылка для чтения - это то, что вы ищете?

$ readlink /tmp/link; echo $?
below cmd output started 2020 Fri Mar 27 08:00:38 AM PDT
/tmp/notthere
0
above cmd output done    2020 Fri Mar 27 08:00:38 AM PDT
dstromberg@dstromberg-inspiron-5570:~ x86_64-pc-linux-gnu 4291

$ readlink /etc/passwd; echo $?
below cmd output started 2020 Fri Mar 27 08:00:46 AM PDT
1
above cmd output done    2020 Fri Mar 27 08:00:46 AM PDT
dstromberg@dstromberg-inspiron-5570:~ x86_64-pc-linux-gnu 4291

$ readlink /tmp/nonexistent; echo $?
below cmd output started 2020 Fri Mar 27 08:00:56 AM PDT
1

HTH

0 голосов
/ 27 марта 2020

Я обычно использую -s, потому что при работе со списком файлов я отправляю список в файл и многократно вытаскиваю первую строку из файла с помощью ed. Ключ -s имеет значение true только тогда, когда длина файла не равна нулю, что означает, что l oop остановится, как только я удалю каждую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...