linux - 可以在 zsh 中结合 glob 排序和交替吗?

标签 linux shell unix zsh

寻找一个 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.3foo1.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/

相关文章:

python - Paramiko 身份验证失败,出现 "Agreed upon ' rsa-sha2-51 2' pubkey algorithm"(和 sshd 日志中的 "unsupported public key algorithm: rsa-sha2-512")

linux - 使用较新版本的 glibc 时出错

gcc C 预处理器可以使用 shell 命令的输出吗?

java - 通过shell脚本将参数从txt文件传递给java文件

apache-spark - 是否可以将HDFS上的tar.gz文件解压缩并将其放在其他HDFS文件夹中,而无需将其带到本地系统

unix - 批量替换文本文件中的文本(Linux/OSX 命令行)

linux - 关于 Cron 的困惑

linux - Windows 与 Linux std::getline 字符串

linux - bash 上的脚本,可以吗?

linux - Bash - 从一个文件中删除行,同时遍历另一个文件中的行