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

答え2

zshに切り替えて実行してください。

for dir (1cv8/*(ND/)) vrunner -src $dir -o builds/$dir:t

そして:

  • (ND/)グローバル修飾子は次のとおりです。
    • N: nullglob: 一致するものがない場合、エラーは報告されません。
    • D:隠しファイルを含めます(findデフォルトと同じ)。隠しディレクトリを実際に処理したい場合を除き、スキップすることをお勧めします。
    • /: グローバル拡張子をファイル形式に制限します。目次(例えばfind-type d
  • $dir:ttcshやvimなどのディレクトリのail(デフォルト名)。

関連情報