我有一个包含以下名称结构的文件的目录。
<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 风格的 shell 中(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
答案2
利用您的文件名,ls
默认情况下按词法排序:
ls | awk -F . '
$1 != current_device {
current_device = $1
n5[$1] = n4[$1]
n4[$1] = n3[$1]
n3[$1] = n2[$1]
n2[$1] = n1[$1]
n1[$1] = $0
}
END {
for (device in n1) {
print n1[device]
print n2[device]
print n3[device]
print n4[device]
print n5[device]
}
}
'
我假设设备名称不包含点。结果可能不会被排序
答案3
可能需要一些改变,但是:
ls <DEVICE>.* | sort -r | tail -n +<X+1> | xargs echo rm
这样就会输出rm语句,去掉“echo”就直接删除了。