我正在尝试删除 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
转换some123file5123with3numbers
为123-5123-3
which 然后用于n
数字排序。