我有一个名称相似的文件目录,但以递增的数字作为后缀。我想删除后缀较低的文件,只保留后缀最高的文件。下面是一个示例文件列表:
1k_02.txt
1k_03.txt
1l_02.txt
1l_03.txt
1l_04.txt
2a_05.txt
2a_06.txt
4c_03.txt
4c_04.txt
上面的列表需要缩减为以下文件:
1k_03.txt
1l_04.txt
2a_06.txt
4c_04.txt
我什至不知道从哪里开始,但如果可能的话我想要一个 bash 命令。
答案1
复杂的管道:
文件列表:
$ ls
1l_04.txt 2a_05.txt 4c_03.txt 1k_03.txt 1l_02.txt 4c_04.txt 2a_06.txt 1l_03.txt 1k_02.txt
printf "%s\n" * | sort -t'_' -k1,1 -k2nr | awk -F'_' 'a[$1]++' | xargs rm
结果:
$ printf "%s\n" *
1k_03.txt
1l_04.txt
2a_06.txt
4c_04.txt
答案2
和zsh
:
$ ls
1k_02.txt 1l_02.txt 1l_04.txt 2a_06.txt 4c_04.txt
1k_03.txt 1l_03.txt 2a_05.txt 4c_03.txt
$ (typeset -A seen; for f (*_*(nOn)) let 'seen[${f%_*}]++' && rm -- $f)
$ ls
1k_03.txt 1l_04.txt 2a_06.txt 4c_04.txt
(看如何在算术表达式中安全地使用关联数组?为什么我们使用let
而不是在((...))
这里)。