POSIXly

POSIXly

目标:检查是否存在包含今天日期的备份 .tgz 文件;输出 1 表示正常,0 表示无文件。

我很喜欢一个衬垫:) 例如在 PHP 中(在 Javascript 中非常相似),在各种场景中我喜欢做类似的事情

<?php
echo (date("d")==1)?"Monday":"Not Monday";
?>

Bash 中有类似的语法吗?我知道如何使用 -f FILENAME 检查常规文件是否存在,我只想命令打印 1 或 0 :)

答案1

你可以简单地这样做:

#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

在 shell 中该字符[表示测试, -e如果文件存在则]测试结束&&如果命令返回 true 则执行后面的命令,||如果命令返回 false 则执行后面的命令。
这应该适用于shellbash

答案2

if [ ! -f /tmp/foo.txt ]; then echo "File not found!"; else echo "file found"; fi

答案3

zsh

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

将输出当前目录中名称包含当前日期的文件数,格式为 YYYY-mm-dd 并.tgz以十进制数字结尾。如果您只需要 0 或 1,请替换(DN)为。(DN[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我们模式的 ing,因此它应该相对安全。

如果文件名包含不构成有效字符的字节序列,您可能会看到差异。优点之一是,如果当前目录不可读,您将收到一条错误消息。

答案4

作为另一种变体,如果您知道要查找的文件名的确切格式,则可以使用

[ ! -f FILENAME ]; echo $?

或者

echo `[ ! -f FILENAME ]` $?

但是这无法处理通配符,因此包含今天日期的以 .tgz 结尾的文件将需要更复杂的内容,例如

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

相关内容