Подтвердить что ты не робот

Как проверить, существует ли файл в оболочке script

Я бы хотел написать оболочку script, которая проверяет, существует ли определенный файл archived_sensor_data.json, и если да, удаляет его. Следуя http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html, я пробовал следующее:

[-e archived_sensor_data.json] && rm archived_sensor_data.json

Однако это вызывает ошибку

[-e: command not found

когда я пытаюсь запустить полученный test_controller script с помощью команды ./test_controller. Что не так с кодом?

4b9b3361

Ответ 1

Вам не хватает необходимого промежутка между кронштейном и -e:

#!/bin/bash
if [ -e x.txt ]
then
    echo "ok"
else
    echo "nok"
fi

Ответ 2

Вот альтернативный метод с использованием ls:

(ls x.txt && echo yes) || echo no

Если вы хотите скрыть любой вывод из ls, поэтому вы видите только да или нет, перенаправляйте stdout и stderr на /dev/null:

(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no

Ответ 3

В любом случае, команда rm должна проверять существование файла,
так зачем добавлять еще один тест? Просто выдайте

rm filename

и после этого он исчезнет, был ли он там или нет.
Используйте rm -f, если вы не хотите получать сообщения о несуществующих файлах.

Если вам нужно предпринять какое-либо действие, если файл НЕ существует, то вы должны проверить это самостоятельно. Исходя из вашего примера кода, в данном случае это не так.

Ответ 4

Фоном для моей рекомендации по решению является история друга, который, на второй неделе его первая работа, вытерла половину build-сервера в чистоте. Таким образом, основная задача состоит в том, чтобы выяснить, существует ли файл, и если да, то пусть его удалит. Но на этой реке есть несколько коварных порогов:

  • Все это файл.

  • Скрипты имеют реальную силу, только если они решают общие задачи

  • В общем, мы используем переменные

  • Мы часто используем силу -f в сценариях, чтобы избежать ручного вмешательства

  • А также люблю рекурсивный -r, чтобы быть уверенным, что мы создаем, копируем и уничтожаем своевременно.

Рассмотрим следующий сценарий:

У нас есть файл, который мы хотим удалить: filesexists.json

Это имя файла хранится в переменной

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

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

<host>:~/Documents/thisfolderexists pathtofile=".."

<host>:~/Documents/thisfolderexists ls $pathtofile

filesexists.json  history20170728  SE-Data-API.pem  thisfolderexists

Итак, давайте посмотрим, сделает ли -e то, что должен. Файлы существуют?

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

Это так. Магия.

Однако, что произойдет, если переменная файла будет случайно оценена как nuffin '

<host>:~/Documents/thisfolderexists filevariable=""

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

Что? Он должен вернуться с ошибкой... И это начало истории, как это все папка была случайно удалена

Альтернативой может быть проверка специально для того, что мы понимаем как "файл"

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

0

Итак, файл существует...

<host>:~/Documents/thisfolderexists filevariable=""

<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

1

Так что это не файл и, возможно, мы не хотим удалять весь этот каталог

man test может сказать следующее:

-b FILE

       FILE exists and is block special

-c FILE

       FILE exists and is character special

-d FILE

       FILE exists and is a directory

-e FILE

       FILE exists

-f FILE

       FILE exists and is a regular file

...

-h FILE

       FILE exists and is a symbolic link (same as -L)

Ответ 5

Если вы используете NFS, "тест" - лучшее решение, потому что вы можете добавить к нему тайм-аут, если ваш NFS не работает:

time timeout 3 test -f 
/nfs/my_nfs_is_currently_down
real    0m3.004s <<== timeout is taken into account
user    0m0.001s
sys     0m0.004s
echo $?
124   <= 124 means the timeout has been reached

Конструкция "[-e my_file]" будет зависать до тех пор, пока NFS снова не будет функционировать:

if [ -e /nfs/my_nfs_is_currently_down ]; then echo "ok" else echo "ko" ; fi

<no answer from the system, my session is "frozen">