ファイルを繰り返し、x日より古いが未使用のファイルを削除する方法

ファイルを繰り返し、x日より古いが未使用のファイルを削除する方法

だから私はこれのいくつかを自分で見つけることができましたが、それをすべて一つにまとめることは困難でした。自動化する必要がある作業があります。フォルダにはギガバイト単位の古いファイルがいっぱいですが、2つの条件を満たしている場合はそのファイルを削除したいと思います。

  1. ファイルは過去14日間に変更されたことはありません。そのために私はfindを使います。

find /dir/* -type f -mtime +14

  1. ファイルが利用できない場合は、次のように確認できます。

lsof /dir/*

私はこれらのコマンドを組み合わせる方法を理解するのに十分なbashをまだ知りません。どんな助けでも大変感謝します。私は本質的にfind出力の各行を繰り返してlsof出力にあることを確認し、そうでない場合はrm -fを実行したいと思います。しかし、目標を達成すると、選択肢が開いています!

答え1

次は動作します。

for x in `find <dir> -type f -mtime +14`; do lsof "$x" >/dev/null && echo "$x in use" || echo "$x not in use" ; done

echo "$x not in use"コマンドの代わりにコマンドを入力できますrm "$x"

仕組み:

  • 最後に変更されてから14日以上経過したファイルを探す:

find <dir> -type f -mtime +14

  • リスト内の項目を繰り返します。

for x in <list>; do <command>; done

  • lsof結果が次の場合はコマンド2を実行し0、そうでない場合はコマンド1を実行します。

lsof "$x" && <command 1> || <command 2>

これは次のように異なります。怠惰な評価Bash はコマンド 1 またはコマンド 2 を実行します。

マイシステム(Ubuntu 14.04)では、スペースを含むファイル名と?スペースを含むファイル名にも機能します。しかし、これがすべてのシステムのすべてのシェルで動作することを保証するわけではありません。コマンドをコマンドに置き換える前にテストしてください。*
echorm

答え2

-execfindのタスクを使用して各ファイルに対してコマンドを実行します。これは引数を使用してプログラムを実行します。より複雑なコマンド(変数の拡張、条件など)が必要な場合は、明示的にシェルを呼び出す必要があります。

find /dir/* -type f -mtime +14 -exec sh -c '
  if …; then
    rm "$0"
  fi
' {} \;

ファイルが現在開いているかどうかをテストする最も簡単な方法は、次のように呼び出すことです。fuser

find /dir/* -type f -mtime +14 -exec sh -c '
  if ! fuser "$0" >/dev/null 2>/dev/null; then
    rm "$0"
  fi
' {} \;

ファイルが長い間変更されておらず、現在開かれていないとしても、それは役に立たないという意味ではありません。少なくともしばらくファイルを読んでいないことをテストすることをお勧めします。これはアクセス時間でテストできますが、Linuxシステムはアクセス時間を確実に更新しないことに注意してください。 (カーネルバージョン、マウントオプション、修正時間に対するアクセス時間によって、実行の有無と頻度が異なります。)

ファイルを削除する前に確認することをお勧めします。

find /dir/* -type f -mtime +14 -atime +14 -exec sh -c '
  if ! fuser "$0" >/dev/null 2>/dev/null; then
    echo "$0"
  fi
' {} \; >files-to-delete-potentially.txt

ファイル名を確認し、アーカイブしたいファイルを削除してください。次に、すべてのファイル名に改行文字が含まれていないと仮定し、すべて削除するには、次のようにします。

<files-to-delete-potentially.txt tr '\n' '\0' | xargs -0 rm

答え3

lsof悪夢のようなオプションと興味深い解析出力があるのではなく、orオプションを使用することをお勧めします。これにより、ファイルアクセス時間(日単位または秒単位)を個別に指定できます。-atime-aminfind

ファイルが現在「使用中」であることを確認するために別のプロセスを使用する代わりに、過去のN秒または数日間ファイルにアクセスしたことを確認できます。

次のコマンドは、変更後14日を超えてアクセスされた時間が60秒未満のすべてのファイルを一覧表示します。

find "$dir" -type f -mtime +14 -amin -60

findこの基準を満たすファイルを削除するには、コマンドを使用できます-exec command ;。奇妙なことは、各コマンドパラメータを個別に指定し、;セミコロン()で終わることです。引数に存在する場合は、{}処理中のファイル名に置き換えられます。

このコマンドは、生成されてから14日以上経過し、過去60分間にアクセスされなかったすべてのファイルを削除します。

find "$dir" -type f -mtime +14 -amin -60 -exec rm '{}' \;

関連情報