对 cd/ln 命令的“*”通配符的输出进行排序

对 cd/ln 命令的“*”通配符的输出进行排序

我创建一个小脚本来帮助将一些文件符号链接到特定目录(在本例中,它从克隆的存储库到主机操作系统(在本例中为 macos)上的主题文件夹),无论如何,问题是搅拌机创建新文件夹来管理每个版本的首选项本身

3.1
└ Config
└ Scripts
└ Startup

3.2
└ Config
└ Scripts
└ Startup

。等等

我发现我可以使用“*”通配符来表示这些,但我需要一种方法来为 ln 命令选择具有最高数值的文件夹

如果有任何帮助的话,我到目前为止想出的命令只是

ln -sf /'path to theme file' '.../'directory with highest numerical value'/.../interface-theme')

答案1

zsh

() {
  ln -sf -- /'path to theme file' $argv[-1]/interface-theme
} '.../'*'/...(/n)

其中nglob 限定符启用numericglobsort(在之后而不是在和之间3.10排序)该 glob 并将glob 限制为以下类型的文件3.93.13.2/目录(替换为-/也考虑到目录的符号链接;注意它*本身确实遵循符号链接)。我们将有序的目录列表传递给匿名函数,在$argv[-1]该函数中我们使用命令中的最后一个参数 ( ) ln

或者,使用eglob 限定符附加链接名称并[-1]选择最后一个 glob 扩展:

ln -sf -- /'path to theme file' '.../'*'/...(/n[-1]e[REPLY+=/interface-theme])

使用bash(GNU shell)4.4 或更新版本以及 GNU 实用程序,您可以执行以下操作:

print0() {
  (( $# == 0 )) || printf '%s\0' "$@"
}
readarray -td '' dirs < <(
  shopt -s nullglob
  print0 '.../'*'/...'/ |
    sort -zrV
) &&
  (( ${#dirs[@]} )) &&
  ln -sf -- /'path to theme file' "${dirs[1]}"interface-theme

-V(又名)--version-sort进行类似于zshnglob 限定符的排序。*/类似于zsh's *(-/)(选择目录和目录的符号链接),只是/附加了 a。

或者假设zsh可用,你可以这样做:

zsh -c '
  ln -sf -- /"path to theme file" ".../"*"/...(/n[-1]e[REPLY+=/interface-theme])'

相关内容