データベースをバックアップするフォルダがあり、午前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で 埋め込まれたシェルスクリプトのパラメータ。$1findによって割り当てられました 見つかったパス名の1つとして。statの%Yオプション コマンドは、エポック以降の変更時間を秒単位で返します。 -
date -d @ ... +%-H—これは、上記のコマンド置換からエポックから数秒かかり、dateに問い合わせます。 その時間の時間の部分を私たちに与えるために;@構文はdateに指示します 入力形式として、エポックからの秒数を指定しています。-を使用 日付出力形式のオプションでは、GNUの日付をしないように指示します。 値に先行ゼロを埋め込みます。これにより、後で8進数の誤解を防ぐことができます。
$hを取得したら 時間変数が割り当てられ、bashの条件演算子[[を使用します その値が11以上であり、厳密に15未満であるかどうかを尋ねます。