「bigger」という名前のn個のファイルを除くファイルを削除しますか?

「bigger」という名前のn個のファイルを除くファイルを削除しますか?

最後のn個のファイルを除く以前のバージョンのファイルを削除するシェルスクリプトを作成したいと思います。つまり、新しいバージョンをデプロイすると、最後のnバージョンのみが保持されます。

ファイル名の形式は次のとおりです。

appname_releasenumber_date.tar.gz

たぶんこれには簡単な解決策があるかもしれませんが、どうすればいいのかわかりません。

この解決策を見つけましたLinuxでファイル名の一部として日付スタンプを含むファイルを削除するためのよりきれいな方法ただし、必要なファイル数を維持するには、まずいくつかのファイルを作成する必要があります。

答え1

もっと一般的にするために@Saltonの答えを変更します。

ls -1 | sort -t_ -n -k2 | head -$((`ls | wc -l`-1)) | xargs rm -rf

これはバージョン番号でソートし、日付を完全に無視します。したがって、以前のバージョンの日付が最新の場合、古いバージョンは削除されます。

答え2

zsh でバージョンがアルファベット順になっている場合:

rm -f appname_*.tar.gz(N[1,-$((n+1))])

これグローバル予選 [NUM1,NUM2]NUM1からNUM2までの一致のみが保持されます。マイナス記号を使用すると、数字が最後から計算されるため(-1が最後の一致)、最後のファイルを除くすべての[1,-$((n+1))]ファイル$nが一致します。 glob修飾子は、N一致する項目がなくても問題にならないことを意味します($nすでに存在するファイルが多い場合に発生する可能性があります)。

バージョンがアルファベット順になっていない場合は、ファイルを別の順序で並べ替える必要があるかもしれません。 glob修飾子はn10進数を値でソートするので、appname_9_somedate後にappname_10_someotherdate

rm -f appname_*.tar.gz(nN[1,-$((n+1))])

バージョン番号がより複雑な場合は、独自のソート機能を指定できます。version_less最初の引数が2番目の引数より小さい場合は、0を返すzsh関数を作成し、次のようにします。

rm -f appname_*.tar.gz(N[1,-$((n+1))]o+version_less)

すべてのシェルでファイルがアルファベット順になっている場合は、一致を繰り返すことができます。

set appname_*.tar.gz
while [ $# -gt $n ]; do
  rm "$1"
  shift
done

別の順序が必要な場合は、解析された出力がls最良の選択です。これにより、lsファイル名で印刷できない文字が壊れる可能性がありますが、あなたの場合は問題になりません。

答え3

最も古いファイルを検索し、ファイルの総数がN個のファイルより大きいことを確認し、最初にスクリプトから最も古いファイルを削除するか、次の例を使用することができます。最後の3つの最新ファイルを削除したくないとしましょう。

ls -t1 | tail -n +4 | xargs rm -rf

関連情報