我的问题和标题可能不太好,对此我提前表示歉意。
假设我想执行一个命令(具体来说,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:h
to$f:h:P
以获得真实路径分别代表文件和文件头。
在这里,您可能需要更改schemas/core/**/*.xsd
为schemas/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%/*}
删除以 开头的最短尾随子字符串/
(有效地生成父目录的路径)。