私はカメラを持って、毎日それを記録します。この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} ]
構造にはファイルが1つだけ必要です。ワイルドカードがあるとは、*
正確に1つのファイルが見つからない限り、パターンが1つではなく一致するすべてのファイルを見つけることを意味します。
第三に、それほど重要ではないことは、スクリプトを使用してディレクトリを変更する場合、構造体のフルパスが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)