web-dev-qa-db-ja.com

2つの時間の間に作成されたファイルを削除する方法?

データベースをバックアップするフォルダーがあり、午前11時から午後3時までに作成されたすべてのバックアップを削除したいのですが、それが何日であるかは関係ありません。これが問題です。

このコマンドは非常に役立ちましたが、私のユースケースでは役に立ちませんでした:

find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete

しかし、ここでは2つの日付の間隔を強制します。 2つの特定の時間の間に作成されたバックアップのみを削除したい。

4
Ismail Sensei

簡単に言えば、 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
_

`find`の-execオプションについて理解する

_{} +_の結果が必要なため、ここでは_-exec_バージョンのfindが必要なではないことに注意してください。ファイルごとにするため、時間範囲に一致するファイルのみを削除します。

埋め込みシェルスクリプトには2つの主要部分があります。ファイルの「時間」タイムスタンプを決定し、範囲に基づいて成功または失敗を返します。最初の部分は2つの部分から成ります。変数には、コマンド置換の結果が割り当てられます。コマンドは裏返して読む必要があります:

  1. $(stat -c %Y "$1")-この(2番目の)コマンド置換は、埋め込みシェルスクリプトの_$1_パラメーターで stat を呼び出します。 _$1_は、見つかったパス名の1つとしてfindによって割り当てられました。 statコマンドの%Yオプションは、修正以降の時間を秒単位で返します。
  2. _date -d @ ... +%-H_-これは、上記のコマンド置換からエポック秒を取得し、dateにその時間の時間部分を提供するように要求します。 _@_構文dateに、入力形式としてエポックから数秒後に与えていることを伝えます。日付出力形式の_-_オプションを使用すると、GNU date tonotvalue to pad value)先頭にゼロを付けます。これにより、8進数の誤解を後で防ぐことができます。

_$h_ Hour変数を割り当てたら、bashの条件演算子_[[_を使用して、その値が11以上か、厳密に15未満かを確認します。

5
Jeff Schaller

理想的ではありませんが、これは役に立つかもしれません。

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
0
Lewis M