我有一台相机,每天记录文件。这些 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)