按数字顺序删除除最新文件之外的文件

按数字顺序删除除最新文件之外的文件

我正在尝试删除 bash 脚本中的文件。

我可以列出最新的文件:

ls | grep core | tail -n 1

并将其重命名为keep-core-2994-xyz.bin,然后删除其余部分:

rm -f core-*

然后将最新的重命名为原始的。这样,我可以保留最新的文件并删除其余的。这对于这种情况效果很好:

-rw-------  1 root root  47M Sep  3  2017 core-2994-xyz.bin
-rw-------  1 root root  47M Sep  3  2017 core-3012-xyz.bin
-rw-------  1 root root  79M Sep  3  2017 core-3106-xyz.bin

然而,这一个:core-10000-xyz.bin引起了麻烦:

-rw-r--r--  1 root root  55M Sep  3  2017 core-10000-xyz.bin
-rw-------  1 root root  47M Sep  3  2017 core-3012-xyz.bin
-rw-------  1 root root  79M Sep  3  2017 core-3106-xyz.bin

……因为这一次,我需要和我想要的人在一起head,而不是和……在一起tail

除了按此命令创建的最新文件之外,是否有任何有效的方法来删除文件? (这里,core-3012-xyz.bin

文件时间戳不可靠;这是一个嵌入式设备,时间戳可能会因互联网连接而改变,所以我无法按时间戳列出它们。

这是一个嵌入式设备,我不想用 zsh 编译它;我想要一个仅 bash 的解决方案。

答案1

zsh

rm -f -- *core*(n[1,-2])

其中glob 限定符针对该 glob 扩展n打开并选择第一个到倒数第二个。numericglobsort[1,-2]

或者:

rm -f core-<1-4294967295>-xyz.bin(n.[1,-2])

如果您想让它更具体,则<1-2147483647>匹配代表有效 pid 数字范围内的数字的数字序列,并且限定符.将扩展限制为常规的仅文件。

请注意,core-bar-123会排序 core-bar-1000而且也是之前core-foo-1。当比较数字之前的部分相同时,使用数字排序。这里core-bar排序在前core-foo。向其中任何一个添加数字都不会改变这一点。

要在排序时仅考虑数字,您可以执行以下操作:

extract_numbers() {
  set -o localoptions -o extendedglob
  REPLY=${${${REPLY//[^0-9]##/-}#-}%-}
}
rm -f --  *<->*(.no+extract_numbers[1,-2])

whereextract_numbers转换some123file5123with3numbers123-5123-3which 然后用于n数字排序。

答案2

哦,我找到了解决方案。

ls -v | grep core | tail -n 1

会成功的。

参考:

列出按数字排序的文件

相关内容