选择最新文件并按名称分组

选择最新文件并按名称分组

我有一个包含以下名称结构的文件的目录。

<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”就直接删除了。

相关内容