如何在 zsh 中重用星号路径?

如何在 zsh 中重用星号路径?

我的问题和标题可能不太好,对此我提前表示歉意。

假设我想执行一个命令(具体来说,xsdcxx)如zsh

$ xsdcxx cxx-tree schemas/core/**/*.xsd --output-dir /absolute/path/to/globbed/path

以便生成文件的目录结构与输入.xsd模式位于同一目录中。我该怎么做呢?在 PowerShell 中,这非常简单(假设xsdcxx已经在 中PATH):

> Get-ChildItem -Recurse -Include '*.xsd' | Foreach { xsdcxx cxx-tree --output-dir $_.Directory.Fullname $_.Fullname } 

答案1

有了zsh,那就是:

for f (schemas/core/**/*.xsd) xsdcxx cxx-tree --output-dir $f:h $f

csh 或 vim 中的 like$f:h的头(dirname)在哪里。$f

更改$f$f:P$f:hto$f:h:P以获得真实路径分别代表文件和文件头。

在这里,您可能需要更改schemas/core/**/*.xsdschemas/core/**/*.xsd(N)(其中N启用nullglob该全局扩展)以避免在没有匹配项时出现错误。或者(N.)仅限于常规文件(不包括所有其他类型的文件,如套接字、fifo、目录、符号链接等),或者(N-.)还包括常规文件的符号链接。


1,这是相应文件的规范路径:绝对且无符号链接,就像realpath()标准函数一样。另请参阅:a:A中描述的修饰符info zsh modifiers作为可能的替代方案。

答案2

看起来你想要类似的东西:

for i in schemas/core/**/*.xsd; do xsdcxx cxx-tree "$i" --output-dir "${i%/*}"; done

其中${i%/*}删除以 开头的最短尾随子字符串/(有效地生成父目录的路径)。

相关内容