最後に生成されたアーカイブログを保持することを除いて、アーカイブログ全体を削除したいと思います。

最後に生成されたアーカイブログを保持することを除いて、アーカイブログ全体を削除したいと思います。

すべてのアーカイブログを削除し、最後に生成されたアーカイブログのみを維持したいと思います。

現在、フル/すべてのアーカイブログを削除し、ディレクトリ自体を消去する次のコマンドを使用しています。

find . -name "dbf*" -mtime +0 -exec rm -rf {} \;

しかし、最後に生成されたアーカイブログを維持したいと思います。どうすればいいですか?同じ結果を得るにはどのコマンドを使用する必要がありますか?

答え1

1日に1つのファイルのみが生成されることがわからない場合(この場合は失敗したコマンドが機能します)、ファイルfindの日付/時刻スタンプとファイル名の組み合わせの出力をパイプし、日付/時刻スタンプを分割して(再)除外する必要がありますsort。します。結果名を入力する前の最後の行:sedsedxargs -0 rm

find . -type f -name "dbf*" -printf "%T@:%p\0" | sort -z | sed -z '$d' | \
       sed -z 's/[0-9\.]*://' | xargs -0 rm

ファイル名は./2番目のファイル名で始まるため、sed一致が多すぎても最初の「:」のみが一致します(-printf "%T@:%p"このような結果を提供します 1424765805.0206990940:./dbf_xyz)。

これは、チェーン全体がNULで終わる「行」を使用するため、スペースと改行文字を含むファイル名にも当てはまります。

答え2

この方法は、残りのファイルを削除しながら最新のファイルを別のディレクトリにコピーしても問題ない場合に有効です。現在の作業ディレクトリがログを含むディレクトリであるとします。

cp $(ls -Art | tail -n 1) /tmp \
&& rm -ri /path/to/logs \
&& cp /tmp/$(ls -Art /tmp | tail -n 1) ./ \
&& rm -i /tmp/$(ls -Art /tmp | tail -n 1)

分割:

  • cp $(ls -Art | tail -n 1) /tmpls -Art | tail -n 1最後に変更されたファイルを出力する必要があるファイルを/tmpディレクトリにコピーします。代わりに、これには新しいディレクトリを作成するか、/tmp他の変更されたファイルがないディレクトリを使用する必要があります。

  • rm -ri /path/to/logsこのディレクトリのすべてのファイル記述子を削除する必要があります。

  • cp /tmp/$(ls -Art /tmp | tail -n 1) .//tmp最後に変更されたファイルが作業ディレクトリにコピーされます。

  • rm -i /tmp/$(ls -Art /tmp | tail -n 1)にコピーしたファイルを削除してください/tmp

関連情報