find -exec 中的基名

find -exec 中的基名

我需要在查找结果中使用完整路径和目录名称。这不起作用:

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一如既往地删除了您的测试真的

也可以看看:


bashshell 中,由于您实际上并不使用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:tt目录的 ail(基本名称),如 csh 或 vim 中的。

相关内容