我需要在查找结果中使用完整路径和目录名称。这不起作用:
find ./1cv8 -maxdepth 1 -type d -wholename "./1cv8/*" -exec bash -c 'echo vrunner -src "{}" -o ./builds/"${basename "{}"}"' \;
错误:
bash: ${basename "./1cv8/common"}: bad substitution
bash: ${basename "./1cv8/conf"}: bad substitution
bash: ${basename "./1cv8/x86_64"}: bad substitution
请帮忙
直接错误是由于使用
${...}
代替命令替换而导致的$(...)
。但是,您通常也不希望使用 将路径名注入到内联 shell 脚本中{}
,而是将其作为参数传递给bash -c
:或者,为了稍微提高速度,不为每场比赛启动新的 shell,
这样,您将不会遇到包含引号的名称或 shell 将解释为扩展、重定向、管道等内容的问题,因为路径名不再被注入并用作 shell代码。
请注意,我删除了您的
-wholename
测试,因为它始终是true。也可以看看:
在
bash
shell 中,由于您实际上并不使用find
在顶级目录之外的任何其他目录中查找目录:只需切换到
zsh
并执行以下操作:和:
(ND/)
全局限定符为:N
: nullglob: 如果没有匹配则不报告错误D
:包括隐藏文件(就像find
默认情况下一样),除非您确实想要处理隐藏目录,否则您可能需要跳过它。/
:将 glob 扩展限制为目录类型的文件(如find
's-type d
)。$dir:t
:t
目录的 ail(基本名称),如 csh 或 vim 中的。