Один лайнер для проверки существования файла

quotaon -avвместо крона quotacheckрешили проблему.

9
09.10.2018, 16:56
7 ответов

Вы можете использовать эту команду:

test -e *$(date).tgz && echo 1 || echo 0
6
27.01.2020, 20:04

Вы можете просто сделать это:

#to check if it's a regular file
[ -f "/you/file.file" ] && echo 1 || echo 0
#to check if a file exist
[ -e "/you/file.file" ] && echo 1 || echo 0

В оболочке этот символ [означает тест, -eесли файл существует ]конец теста &&если команда возвращает true выполнить команду после, ||если команда возвращает false выполнить команду после.
Это должно работать в shellи bash

.
31
27.01.2020, 20:04

Сzsh:

(){echo $#} *"$(date +%Y-%m-%d)"*.tgz(DN)

Будет выводить количество файлов в текущем каталоге, имя которых содержит текущую дату в формате ГГГГ -мм -дд и заканчивается на .tgzв виде десятичного числа. Замените (DN)на (DN[1]), если вы хотите только 0 или 1.

Чтобы использовать в качестве условия в операторе if, вы можете сделать:

if ()(($#)) *"$(date +%Y-%m-%d)"*.tgz(DN); then
   echo found
else
   echo none found
fi

Вbash

эквивалентом может быть:

(shopt -s nullglob dotglob; set -- *"$(date +%Y-%m-%d)"*.tgz; echo "$#")

(замените "$#"на "$(($#>0))", чтобы получить 0 или 1 ).

и

if (shopt -s nullglob dotglob; set -- *"$(date +%Y-%m-%d)"*.tgz; (($#))); then
   echo found
else
   echo none found
fi

Сksh93:

(FIGNORE='@(.|..)'; set -- ~(N)*"$(date +%Y-%m-%d)"*.tgz; echo "$#")

и

if (FIGNORE='@(.|..)'; set -- ~(N)*"$(date +%Y-%m-%d)"*.tgz; (("$#"))); then...

POSIXly

ls -qA | grep -c "$(date +%Y-%m-%d).*\.tgz$"

для кол.

ls -qA | grep -q "$(date +%Y-%m-%d).*\.tgz$"; echo "$(($? == 0))"

для 0 или 1 и:

И:

if ls -qA | grep -q "$(date +%Y-%m-%d).*\.tgz$"; then...

Хотя здравый смысл состоит в том, чтобы не анализировать вывод ls, здесь с -qмы обеспечиваем наличие одного файла в строке и замену непечатаемых -символов на ?. не влияет на grepдля нашего шаблона, поэтому он должен быть относительно безопасным.

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

9
27.01.2020, 20:04
if [ ! -f /tmp/foo.txt ]; then echo "File not found!"; else echo "file found"; fi
18
27.01.2020, 20:04

Я знаю, что вы просили Bash, но если вы ищете любую программу командной строки, которая будет работать, я рекомендую Python:

python -c "import os; exists = os.path.isfile('myFile.txt'); print(int(exists))"
0
27.01.2020, 20:04
ls filename 2> /dev/null && echo 1 || echo 0

Или, если вы хотите, чтобы это было в переменной

EXISTS=$(ls filename 2> /dev/null && echo 1 || echo 0)
0
27.01.2020, 20:04

Еще один вариант: если бы вы знали точный формат имени файла, который вы искали, вы могли бы использовать

[ ! -f FILENAME ]; echo $?

или

echo `[ ! -f FILENAME ]` $?

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

echo $( for entry in *$(date --rfc-3339=date)*.tgz; do [ -f "$entry" ] && exit 1; done; exit 0 ) $?
4
27.01.2020, 20:04

Теги

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