検索結果にフルパスとディレクトリ名を使用する必要があります。これはうまくいきません:
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:t
:t
cshやvimなどのディレクトリのail(デフォルト名)。