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