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