次の名前構造のファイルを含むディレクトリがあります。
<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