Zsh:删除除最高字典排序顺序之外的所有文件

时间:2016-04-04 15:37:35

标签: zsh

我有一组匹配特定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为空,这会出错。

如果您知道更简单的方法,请提供一些建议。

2 个答案:

答案 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