データベースをバックアップするフォルダーがあり、午前11時から午後3時までに作成されたすべてのバックアップを削除したいのですが、それが何日であるかは関係ありません。これが問題です。
このコマンドは非常に役立ちましたが、私のユースケースでは役に立ちませんでした:
find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete
しかし、ここでは2つの日付の間隔を強制します。 2つの特定の時間の間に作成されたバックアップのみを削除したい。
簡単に言えば、 linux をタグ付けすると、stat
コマンドが使用可能になり、ファイルの変更時刻が抽出され、GNU date
コマンド。指定された時間から時間を抽出します。
_find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
sh {} \; -ls
_
結果が正しい場合、次のようになります。
_find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
sh {} \; -delete
_
以下は、_-ls
_バージョンを使用したテスト実行です。
_$ touch -d 'Wed Sep 12 11:00:01 EDT 2018' 11am
$ touch -d 'Wed Sep 12 12:00:02 EDT 2018' 12pm
$ touch -d 'Wed Sep 12 15:00:03 EDT 2018' 303pm
$ find . -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' sh {} \; -ls
1705096 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./11am
1705097 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./12pm
_
_{} +
_の結果が必要なため、ここでは_-exec
_バージョンのfind
が必要なではないことに注意してください。ファイルごとにするため、時間範囲に一致するファイルのみを削除します。
埋め込みシェルスクリプトには2つの主要部分があります。ファイルの「時間」タイムスタンプを決定し、範囲に基づいて成功または失敗を返します。最初の部分は2つの部分から成ります。変数には、コマンド置換の結果が割り当てられます。コマンドは裏返して読む必要があります:
$(stat -c %Y "$1")
-この(2番目の)コマンド置換は、埋め込みシェルスクリプトの_$1
_パラメーターで stat
を呼び出します。 _$1
_は、見つかったパス名の1つとしてfind
によって割り当てられました。 stat
コマンドの%Yオプションは、修正以降の時間を秒単位で返します。date -d @ ... +%-H
_-これは、上記のコマンド置換からエポック秒を取得し、date
にその時間の時間部分を提供するように要求します。 _@
_構文 はdate
に、入力形式としてエポックから数秒後に与えていることを伝えます。日付出力形式の_-
_オプションを使用すると、GNU date tonotvalue to pad value)先頭にゼロを付けます。これにより、8進数の誤解を後で防ぐことができます。_$h
_ Hour変数を割り当てたら、bashの条件演算子_[[
_を使用して、その値が11以上か、厳密に15未満かを確認します。
理想的ではありませんが、これは役に立つかもしれません。
find . -type f -print | while read l; do
hour=$(stat -c "%z" ${l} | awk '{print $2}' | awk -F: '{print $1}')
if [[ 11 -le ${hour} ]] && [[ ${hour} -le 15 ]]; do
rm -f ${l}
done
done