
すべてのアーカイブログを削除し、最後に生成されたアーカイブログのみを維持したいと思います。
現在、フル/すべてのアーカイブログを削除し、ディレクトリ自体を消去する次のコマンドを使用しています。
find . -name "dbf*" -mtime +0 -exec rm -rf {} \;
しかし、最後に生成されたアーカイブログを維持したいと思います。どうすればいいですか?同じ結果を得るにはどのコマンドを使用する必要がありますか?
答え1
1日に1つのファイルのみが生成されることがわからない場合(この場合は失敗したコマンドが機能します)、ファイルfind
の日付/時刻スタンプとファイル名の組み合わせの出力をパイプし、日付/時刻スタンプを分割して(再)除外する必要がありますsort
。します。結果名を入力する前の最後の行:sed
sed
xargs -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) /tmp
ls -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
。