データベースをバックアップするフォルダがあり、午前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
があります。 ファイルの変更時刻とGNUdate
を抽出するコマンドを使用できます コマンド。指定された時間から時間を抽出します:
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
私が従った優れた答えを書いたKusalanandaの功績: `find`
の-execオプションを理解する
しないことに注意してください {} +
が必要 find
のバージョン ここでは、-exec
が必要です。 結果はファイルごとになるため、時間範囲に一致するファイルのみを削除します。
埋め込まれたシェルスクリプトには2つの主要な部分があります。ファイルの「時間」タイムスタンプを決定し、範囲に基づいて成功または失敗を返します。最初の部分はそれ自体が2つの部分で達成されます。変数には、コマンド置換の結果が割り当てられます。コマンドは裏返しに読む必要があります:
-
$(stat -c %Y "$1")
—この(2番目の)コマンド置換はstat
を呼び出します$1
で 埋め込まれたシェルスクリプトのパラメータ。$1
find
によって割り当てられました 見つかったパス名の1つとして。stat
の%Yオプション コマンドは、エポック以降の変更時間を秒単位で返します。 -
date -d @ ... +%-H
—これは、上記のコマンド置換からエポックから数秒かかり、date
に問い合わせます。 その時間の時間の部分を私たちに与えるために;@
構文はdate
に指示します 入力形式として、エポックからの秒数を指定しています。-
を使用 日付出力形式のオプションでは、GNUの日付をしないように指示します。 値に先行ゼロを埋め込みます。これにより、後で8進数の誤解を防ぐことができます。
$h
を取得したら 時間変数が割り当てられ、bashの条件演算子[[
を使用します その値が11以上であり、厳密に15未満であるかどうかを尋ねます。