2016-09-14 8 views
1

バックアップファイルが3か月以上1年未満のフォルダがあります。彼らは名前の同じ部分を持っていますが、他の部分はバックアップの日付です(私はファイルのグループを持っています)。私のフォルダ内のすべてのファイルから、各グループの3つのzipファイルのみを保持する必要があります。すべてのファイルの最後の3つのファイルではなく、各グループの最後の3つのファイルです。過去。他のファイル、削除します。3つのグループでファイルを処理する方法

例:zipファイルの

一覧:

ais_2016-02-21.zip 
ais_hg_2016-07-31.zip 
ais_hg_2016-08-07.zip 
ais_hg_2016-08-14.zip 
ais_hg_2016-08-21.zip 
ais_hg_2016-08-28.zip 
ais_hg_2016-09-04.zip 
asf_2016-07-17.zip 
asf_2016-07-24.zip 
asf_2016-07-31.zip 
asf_2016-08-07.zip 
asf_2016-08-14.zip 
asf_2016-08-21.zip 
asf_2016-08-28.zip 
asf_2016-09-04.zip 
asf-ant-tasks_2015-12-13.zip 
asf-ant-tasks_2015-12-27.zip 
asf-ant-tasks_2016-01-17.zip 
asf-ant-tasks_2016-01-31.zip 
asf-ant-tasks_2016-02-14.zip 
asf-ant-tasks_hg_2016-02-28.zip 
asf-ant-tasks_hg_2016-08-07.zip 
asf-ant-tasks_hg_2016-08-14.zip 
asf-ant-tasks_hg_2016-08-21.zip 
asf-ant-tasks_hg_2016-08-28.zip 

グループ:

ais 
ais_hg 
asf 
asf-ant-tasks 
asf-ant-tasks_hg 

そして、私はasfから3、ais_hgから3、aisから3つの最後に変更されたファイルを保持する必要がありますしかし、ファイルのグループがもっと多いので(130)、スクリプト内の各グループを手動で書き込むことはできません。

だから私はここにいる。私は2つの配列を持っていて、ここからどこに行くのかわかりません。

+0

外部画像リンクを削除し、同じ画像をテキストで表示します。 – Inian

+0

私の意見では、これはPythonやRubyのような別の言語を考慮する必要があります。 –

+0

しかし、これは不幸にも不可能です:(これは私の新しい仕事の私の仕事なので、私はこの言語を使用しなければなりません – sensey

答えて

1

まず、固有のグループのリストを取得します。次に、各グループに一致するファイルのリストを取得、

for f in *.zip; do 
    echo "${f%%_*}" 
done | sort -u > groups.txt 

(。私は、ファイルの名前に改行を持っていないことを仮定している)、および出力のみ、最後の3:

while IFS= read -r group; do 
    files=("$group"_*.zip) 
    for f in "${files[@]:0:${#files[@]}-3}"; do 
    rm "$f" 
    done 
done < groups.txt 

まず、"${var:s:l}"は、varという値の位置sで始まる長さがlの部分文字列に展開されます。配列に適用すると、配列の要素から始まる配列要素がlの配列要素に展開されます。したがって、filesに9つの要素がある場合、${#files[@]}は9に展開されます。この葉6から3を減算します(slは両方とも算術コンテキストで評価されます)。したがって、${files[@]:0:6}の中間式があります。結果は、配列内の最初の6つのファイルになります。

+0

素晴らしい、それは動作しますが、まだテストしています...; $ {files [@]:0:$ {#files [@]} - 3} "; – sensey

関連する問題