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

${...}代替コマンド置換を使用すると、直接エラーが発生します$(...)。ただし、通常、パス名をインラインシェルスクリプトに挿入するのではなく、次のエントリに引数として渡し{}ますbash -c

find ./1cv8 -maxdepth 1 -type d -exec bash -c '
    echo vrunner -src "$1" \
        -o "./builds/$(basename "$1")"
    ' bash {} \;

または、各ゲームごとに新しいシェルを起動せずに少しスピードアップするために

find ./1cv8 -maxdepth 1 -type d -exec bash -c '
    for pathname do
        echo vrunner -src "$pathname" \
            -o "./builds/$(basename "$pathname")"
    done' bash {} +

これにより、名前に引用符やシェルが拡張、リダイレクト、パイプなどとして解釈される項目を含む名前に問題は発生しません。これはパス名が挿入され、シェルとして使用されなくなったためです。パスワード

-wholenameいつものようにテストを削除しました。本物

また見なさい:


bashシェルは実際には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

おすすめ記事