根据日期查找并显示特定文件

根据日期查找并显示特定文件

我有一台相机,每天记录文件。这些 mp4 文件始终以 yy-mm-dd 开头。我想写一个bash脚本来搜索并显示并检查今天是否有记录。

到目前为止我已经想出了这个:

#! /bin/sh
# start met datum weg te schrijven in variable now met notering jj-mm-dd

now=$(date --rfc-3339=date)`

# regels voor Doorbird

cd /srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams
cd Doorbird
cd videos
cd OOKJv2iZ0r
cd 8MaU67FrBu80

[ -f "/srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/Doorbird/videos/OOKJv2iZ0r/8MaU67FrBu80/"$now"*" ] && echo "Doorbird OK."
[ ! -f "/srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/Doorbird/videos/OOKJv2iZ0r/8MaU67FrBu80/"$now"*" ] && echo "Doorbird NOK."

但这仅显示,Doorbird NOK尽管上述文件夹中存在以 yy-mm-dd 开头的文件。

使用另一台以不同方式对文件进行排序的相机,我能够对日期变量执行目录搜索,但没有 *-通配符,没有任何问题。该代码的代码是:

# regels voor Tuin
cd /srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams
cd 6J0091EPAG73D8B
[ -d "/srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/6J0091EPAG73D8B/"$now"" ] && echo "Tuin OK."
[ ! -d "/srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/6J0091EPAG73D8B/"$now"" ] && echo "Tuin NOK."

在这里,我知道Tuin OK目录何时存在或Tuin NOK不存在。

显然我在这里遗漏了一些东西。我尝试在整个网站中查找通配符位置,但没有成功。

答案1

我可以看到代码存在很多问题。

首先,您要查找日期格式为 的文件,YY-MM-DD但该date --rfc-3339=date命令返回日期格式为YYYY-MM-DD。尝试一下:

date --rfc-3339=date
2021-12-10

其次,该[ -f {file} ]结构只需要一个文件。通配符的存在*意味着您的模式将找到所有匹配的文件,而不仅仅是一个 - 除非恰好找到一个文件。

第三,但不太重要的是,如果您要使用cd脚本更改其目录,则不需要[ -f {file} ]结构中的完整路径 - 您已经在正确的位置了。

现在终于,您已标记为但您已将脚本声明为sh脚本。如果您想使用,bash则应在脚本的第一行 ( #!/bin/bash) 上将其标记为这样。但是,在这种情况下,您没有使用任何bash特定的习惯用法,因此您可以继续sh

#!/bin/sh
# start met datum weg te schrijven in variable now met notering jj-mm-dd

now=$(date +'%y-%m-%d')    # format "YY-MM-DD"

# regels voor Doorbird
cd /srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams &&
  cd Doorbird &&
  cd videos &&
  cd OOKJv2iZ0r &&
  cd 8MaU67FrBu80 || exit

# We're now in the right place so use short filenames
numberOfFiles=$(find . -maxdepth 1 -type f -name "${now}*" -printf . | wc -c)

if [ "$numberOfFiles" -gt 0 ]
then
    echo "Doorbird OK"
else
    echo "Doorbird NOK."
fi

如果您想避免多个cd命令,您可以将完整目录路径提供给find

numberOfFiles=$(
    find /srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/Doorbird/videos/OOKJv2iZ0r/8MaU67FrBu80 -maxdepth 1 -type f -name "${now}* -printf ." |
    wc -c
)

或者甚至声明一个包含路径的变量并通过该变量引用它

dir=/srv/dev-disk-by-uuid-89755130-b502-4d16-943d-6ca02a695f09/Cams/Doorbird/videos/OOKJv2iZ0r/8MaU67FrBu80
# ...
numberOfFiles=$(find "$dir" -maxdepth 1 -type f -name "${now}*" -printf . | wc -c)

相关内容