寻找一个 shell-only[1] 方法来获取这个目录列表:
foo1.1
foo1.10
foo1.10/bar
foo1.2
foo1.3
foo1.3/bar
foo1.4
foo1.5
foo1.5/bar
foo1.6
foo1.7
foo1.8
foo1.9
foo2.1
然后按数字排序返回它,子目录显示在它们的父目录之后:
foo1.1
foo1.2
foo1.3
foo1.3/bar
foo1.4
foo1.5
foo1.5/bar
foo1.6
foo1.7
foo1.8
foo1.9
foo1.10
foo1.10/bar
foo2.1
(*|*/bar)(n)
作为错误模式被拒绝,而 */{,bar}(n)
扩展为 */(n) ~/bar(n)
所以子目录出现在最后。
[1] 我需要它能够在各种各样的系统上工作,所以使用 GNU sort 的 -V 或 GNU ls 的 -v 或类似的东西是行不通的。
最佳答案
您可以轻松地分两步完成:列出,然后排序。
dirs=(* */bar)
dirs=(${(on)dirs})
这依赖于 /
在现有目录的任何后缀之前进行排序,因此如果您的目录名称如 foo1.3-qux
(它将在 foo1.3
和 foo1.3/bar
之间排序。由于所有文件都是目录,因此您可以使用临时的 /
后缀,如果 foo1.3-qux
可以排在 foo1.3
之前:
dirs=(*/ */bar)
dirs=(${${(on)dirs}%/})
为了更健壮,您可以暂时用空字节替换 /
字符,这样可以保证先于任何其他字符排序(至少在 C 语言环境中)并且不会出现在文件中姓名。
dirs=(* */bar)
dirs=(${${(on)${dirs//\//$'\0'}}//$'\0'//})
关于linux - 可以在 zsh 中结合 glob 排序和交替吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32770803/