最新のファイルを選択して名前でグループ化

最新のファイルを選択して名前でグループ化

次の名前構造のファイルを含むディレクトリがあります。

<device>.<yyyy-mm-dd-hh-mm-ss> 

各デバイスに対して、これらの構成バックアップの最後のXコピーを保持するスクリプトを作成しています。これを達成するにはどのような選択魔法が必要ですか?

BASHを考えていますが、実際には言語に拘束されていません。

ベストアンサー1

ワイルドカード文字はファイル名をアルファベット順に拡張します。日付形式はアルファベット順に一致するため、要件はワイルドカードの最後のX一致(またはXより小さい場合はすべての一致)を維持することに要約されます。バックアップが一致するファイルであるとし、$device.*必要に応じてパターンを調整します。

zshから:

set -- $device.*
if [[ $# -gt $X ]]; then set -- $@{[-$X,-1]}; fi
cp -- $@ /retain/area/

Bourneスタイルのシェル(ash、bash、ksh ...)から:

set -- "$device".*
if [ $# -gt $X ]; then shift $(($#-$X)); fi
cp -- "$@" /retain/area

実際に古いファイルを削除するには、X以外の最初の一致から削除する必要があります(Xより少ない場合は一致しません)。

zshから:

files=($device.*)
rm -f -- $files[1,-$X-1]

他のシェルでは:

set -- "$device".*
while [ $# -gt $X ]; do
  rm -- "$1"
  shift
done

おすすめ記事