最も古いファイルを削除するが、サブディレクトリを含む最新のファイルを保持する Bash スクリプト

最も古いファイルを削除するが、サブディレクトリを含む最新のファイルを保持する Bash スクリプト

古いファイルを削除しようとしていますが、最新の3日間のログファイルは保持する必要があります。以下のコマンドを試しました。

ls -tr /home/httpd/htdocs/パス名/パス名/config//ビルド/ログ/アプリ/.log | tail -n +4 | xargs rm --

しかし、すべてのファイルが削除され、1 つのフォルダーに 3 つのファイルのみが残ります。ただし、フォルダーごとに 3 つのファイルを個別に残しておきたいです。

誰かこの問題を解決するのを手伝ってくれませんか。

答え1

これを試すには、次の内容をシェル スクリプト ファイルに入力して実行します。

#!/bin/bash
dirs=($(find /tmp/test -type d))
for dir in "${dirs[@]}"; do
  cd "$dir"
  ls -pt | grep -v / | tail -n +4 | xargs rm -f
done

/tmp/testディレクトリ名に置き換えます。

答え2

次のコマンドを使用できます:

ls -t path | sed -e '1,3d' | xargs -d '\n' rm

またはループで:

for d in $(find path -type d); do
  ls -t "$d" | sed -e '1,3d' | xargs -d '\n' rm
done

どこ:

  • ls -t: 変更時間の降順でファイルをリストします。1 行に 1 つのファイル名が表示されます。
  • sed -e '1,3d': 最初の3行を削除します
  • xargs -d '\n' rm: 各入力行(終了改行を除く)を引数として渡しますrm
  • -d '\n': これは効率化のために必要であり、xargs が各入力行を個別の引数と見なし、同時にコマンドラインに収まるだけの数の引数を渡すようにして、各引数ごとに rm が再度呼び出されないようにします。

さらなる可能性については、投稿をご覧ください bashで最新のXファイル以外をすべて削除する

関連情報