我有一组匹配特定glob模式的文件(例如:* .txt)。除了词典顺序最高的那个之外,我想删除所有这些。
我试图找到各种解决方案,但即使是我提出的最好的解决方案,也很难看:
set -A files *(N)
set -A to_remove ${(O)files}
shift to_remove
foreach f in $to_remove
do
echo rm $f
done
(我没有写rm $to_remove
,因为如果to_remove
为空,这会出错。
如果您知道更简单的方法,请提供一些建议。
答案 0 :(得分:1)
您不需要先创建数组;您可以指定一个范围来过滤文件名扩展返回的文件。
$ touch a b c
$ print -l *(N)
a
b
c
$ print -l *(N[1,-2])
b
c
因此,您可以使用rm *(N[1,-2])
删除除第一个匹配文件之外的所有文件。
你可以用数组做同样的事情:
$ foo=(a b c)
$ print -l $foo[2,-1]
b
c
答案 1 :(得分:1)
如果您在排序数组中有文件名,请使用subscript range;负数从最后算起。
if ((#files > 1)); then rm -- ${files[1,-2]}; fi
如果数组未排序,sort it first。
if ((#files > 1)); then rm -- ${${(o)files}[1,-2]}; fi
如果您只是为此生成文件,则可以从glob qualifier进行选择。
files=(*.txt(N[1,-2]))
if ((#files)); then rm -- $files; fi