存在用于检查文件的一个班轮

Dav*_*Dav 16 bash files

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

我是一个班轮的傻瓜:) 例如在 PHP 中(在 Javascript 中非常相似),在各种情况下我喜欢做类似的事情

<?php
echo (date("d")==1)?"Monday":"Not Monday";
?>
Run Code Online (Sandbox Code Playgroud)

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

Kiw*_*iwy 30

你可以简单地这样做:

#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
Run Code Online (Sandbox Code Playgroud)

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

  • 重要的是要知道,如果 'true' 命令失败,'false' 命令也将被执行 (9认同)
  • 最好使用“if ... fi”而不是“x &amp;&amp; y ||” z`。请参阅[bash陷阱]中的解释(https://mywiki.wooledge.org/BashPitfalls#cmd1_.26.26_cmd2_.7C.7C_cmd3) (2认同)

小智 17

if [ ! -f /tmp/foo.txt ]; then echo "File not found!"; else echo "file found"; fi
Run Code Online (Sandbox Code Playgroud)

  • 应该注意(因为问这样问题的人可能不会考虑它)`-f` 只会提醒您允许查看的文件的存在。如果您对某个目录没有足够的权限,即使您指定了文件的完整路径,也看不到其中的文件。 (2认同)

Sté*_*las 9

zsh

(){echo $#} *"$(date +%Y-%m-%d)"*.tgz(DN)
Run Code Online (Sandbox Code Playgroud)

将输出当前目录中名称包含 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
Run Code Online (Sandbox Code Playgroud)

bash

等价物可能是:

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

(替换"$#""$(($#>0))"得到0或1)。

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

ksh93

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

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

POSIXly

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

为计数。

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

对于 0 或 1 并且:

和:

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

虽然普遍的智慧是不解析ls, 在这里 with的输出-q,但我们确保每行有一个文件,并且不可打印字符的替换?不应影响grep我们模式的ing 所以它应该是相对安全的。

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

  • @pipe,答案也涵盖了 bash。答案不仅适用于 OP,也不是每个人都只能使用“bash”。甚至 OP 也可以考虑切换到不同的 shell。 (5认同)

mrc*_*_kr 6

你可以使用这个命令:

test -e *$(date).tgz && echo 1 || echo 0
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这实际上并不是_return_ 1 或0。它_prints_ 1 或0,这是另一回事。如果您想返回 1 或 0,只需使用 `test -e` 部分,而忽略其余部分。`test` 命令已经根据其状态返回 0 或 1。 (7认同)