日付に基づいて特定のファイルを検索して表示する

日付に基づいて特定のファイルを検索して表示する

私はカメラを持って、毎日それを記録します。この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)

おすすめ記事