Вы можете использовать эту команду:
test -e *$(date).tgz && echo 1 || echo 0
Вы можете просто сделать это:
#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
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...
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
для нашего шаблона, поэтому он должен быть относительно безопасным.
Вы можете увидеть различия, если имена файлов содержат последовательности байтов, которые не образуют допустимые символы.Одним из преимуществ является то, что вы получите сообщение об ошибке, если текущий каталог не доступен для чтения.
if [ ! -f /tmp/foo.txt ]; then echo "File not found!"; else echo "file found"; fi
Я знаю, что вы просили Bash, но если вы ищете любую программу командной строки, которая будет работать, я рекомендую Python:
python -c "import os; exists = os.path.isfile('myFile.txt'); print(int(exists))"
ls filename 2> /dev/null && echo 1 || echo 0
Или, если вы хотите, чтобы это было в переменной
EXISTS=$(ls filename 2> /dev/null && echo 1 || echo 0)
Еще один вариант: если бы вы знали точный формат имени файла, который вы искали, вы могли бы использовать
[ ! -f FILENAME ]; echo $?
или
echo `[ ! -f FILENAME ]` $?
однако это не могло справиться с подстановочными знаками, поэтому для файлов, оканчивающихся на.tgz, содержащих сегодняшнюю дату, потребуется что-то более сложное, например
echo $( for entry in *$(date --rfc-3339=date)*.tgz; do [ -f "$entry" ] && exit 1; done; exit 0 ) $?