Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zsh:删除除字典排序顺序最高的文件以外的所有文件_Zsh - Fatal编程技术网

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

Zsh:删除除字典排序顺序最高的文件以外的所有文件,zsh,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$写入到_remove,因为如果to _remove为空,则会出现错误) 如果您知道更简

我有一组与特定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$写入到_remove
,因为如果
to _remove
为空,则会出现错误)


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

您不需要先创建数组;您可以指定一个范围来过滤文件名扩展返回的文件

$ 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

如果文件名在排序数组中,请使用;负数从末尾算起

if ((#files > 1)); then rm -- ${files[1,-2]}; fi
如果数组未排序

如果您只是为此生成文件,则可以从中进行选择


“最高”是指最小的还是最大的?例如,给定
a.txt b.txt c.txt
,你想保留
a.txt
还是
c.txt
?我想保留c.txt.Great,尽管范围应该是
[1,-2]
,正如@Gilles在回答中所说的那样。啊,对。我开始用
O
排序,就像你原来的一样,然后放弃它,忘记了调整范围。我将你的解决方案改编成
echo*.txt(N[1,-2])|xargs rm--
。非常感谢@user1934428不会这样做:它会打断包含空格或“”的文件名。
if ((#files > 1)); then rm -- ${${(o)files}[1,-2]}; fi
files=(*.txt(N[1,-2]))
if ((#files)); then rm -- $files; fi