0

Linuxデータベースから古いバックアップファイルを削除するように依頼されました(最新の3つを除くすべて)。複数の種類のバックアップがあるため、バックアップの種類ごとに少なくとも3つのバックアップファイルを残す必要があります。

私のスクリプトは、類似した(一致した)名前のすべてのファイルをグループ化し、最後の3つのファイルを除くすべてを削除する必要があります(OSがそれらのファイルを並べ替えると想定しているため、最新のバックアップも最後のバックアップになります)

ファイルは、任意の数字と任意の名前の形式project_name.000000-000000.svndmp.bz2になっています。最初の6桁は名前の一部であり、最後の6桁はバックアップのバージョンを示します。0project_name

これまでのところ、私のコードは次のようになっています。

for i in *.svndmp.bz2 # only check backup files
do
    nOfOccurences = # Need to find out, how many files have the same name
    currentFile = 0
    for f in awk -F"[.-]" '{print $1,$2}' $i # This doesn't work
    do
        if [nOfOccurences - $currentFile -gt 3]
        then
            break
        else
            rm $f
            currentFile++
        fi
    done
done

私のスクリプトは、次のバックアップに進む前に、古いバージョンのバックアップを4回削除しようとする可能性があることを認識しています。私はパフォーマンスや効率を求めていません(バックアップはそれほど多くありません)。

私のコードは4時間のネット検索の結果であり、優れたGoogleクエリが不足しています(そして上司はなぜ私がまだ通常のタスクに戻っていないのか疑問に思い始めています)

誰かが私の問題をどのように解決できるかについて、私に意見を与えることができますか?

  • 探すnOfOccurences
  • パターンに一致するファイルをawkで検索する"$1.$2-*"
4

1 に答える 1

2

これを試して、それがあなたが望むことをするかどうか見てください。

for project in `ls -1 | awk -F'-' '{ print $1}' | uniq`; do
    files=`ls -1 ${project}* | sort`
    n_occur=`echo "$files" | wc -l`
    for f in $files; do
        if ((n_occur < 3)); then
           break
        fi
        echo "rm" $f;
        ((--n_occur))
    done
done

出力に問題がないように思われる場合は、エコーラインを交換してください。ああ、何かがうまくいったとしても私を殴らないでください。自己責任で使用してください。

于 2013-02-11T18:21:49.827 に答える