ファイルセットから最新のファイルを見つけ、zshスクリプトから古いファイルを削除する方法は? [コピー]

ファイルセットから最新のファイルを見つけ、zshスクリプトから古いファイルを削除する方法は? [コピー]

zshスクリプトに問題があります。次のディレクトリにファイルセットがあります。

001_20160223.txt  /delete
001_20161102.txt  /delete
001_20161209.txt  /keep
005_20160502.txt  /delete 
005_20161105.txt  /delete
005_20161206.txt  /keep
009_20160502.txt  /delete
009_20161105.txt  /delete
009_20161205.txt  /keep

これで、同じ開始番号でファイルを並べ替える必要があります。 001 次に、ファイル名に記された日付に基づいて最新のファイルを見つけ、古いファイルを削除します。他のファイルにも同じ方法を実行する必要があります。したがって、ディレクトリの最終出力は次のようになります。

001_20161209.txt  /keep
005_20161206.txt  /keep
009_20161205.txt  /keep

これまでに試したことは次のとおりです。

files=($(find . -name "???_*.txt")) | if ((#files > 1)); then rm -- ${files[1,-2]}; fi

ただし、最後のファイルを除くすべてのファイルは削除されます。同じ起動名で別々のファイルセットを作成し、削除したいと思います。

答え1

sort --reverse最新のファイルが常に同じプレフィックスを持つファイルブロックの最初のファイルになるように、ファイルの順序を逆にすることができます()。その後、現在のブロック(使用済み)を追跡し、$current_prefix各ブロックの最初のファイル(continue)とrmそのブロックの他のすべてのファイルを保持できます。

current_prefix=
find . -name '???_*.txt' | sort --reverse | while read line; do
  if [[ ${line[1,5]} != $current_prefix ]]; then
    # we are at the beginning of a new block
    current_prefix=${line[1,5]}
    continue # actually not needed b/c there is nothing outside the if block.
  else
    rm -- $line
  fi
done

注: これを最初にテストするには、rmすべてのコマンドの前にecho

アーカイブしたいファイルのみを一覧表示するには、sort次のものを使用できますuniq

find . -name '???_*.txt' | sort --reverse | uniq --check-chars 3

関連情報