オペレーターは、<
コマンドを実行する前に、シェルによってリダイレクトとして解釈されます。シェルは という名前のファイルからの入力を の stdin にリダイレクトしよう{}
とfind
しますが、ファイルが存在しない場合はエラーが発生します。
への引数-name
は引用符で囲まれておらず、グロブ文字が含まれています。シェルはパス名展開を適用し、無意味な引数を find に与えます。
ファイル名にスラッシュを含めることはできません。への引数-name
は引用されていても機能しません。GNU find が利用可能な場合は-path
、glob パターンを指定するために使用できますfiles/*
が、これは「files という名前のディレクトリ内のファイル」を意味するものではありません-regex
。ポータブル ソリューションはより困難です。
開始するパスを 1 つ以上指定する必要がありますfind
。
あなたが本当に望んでいたのは、シェルにリダイレクトを実行させることだったと仮定すると、GNU find を使用する方法は次のとおりです。
find . -type f -regex '.*foo/[^/]*$' -exec sh -c 'for x; do ./stagger <"$x"; done' -- {} +
これはおそらく最も移植性の高い方法ですfind
(この場合は機能-depth
し-prune
ません)。
find . -type d -name files -exec sh -c 'for x; do for y in "$x"/*; do [ -f "$y" ] && ./stagger <"$y"; done; done' -- {} +
globstar
Bash を使用している場合、この問題は の代わりにパターンを使用するための非常に良い候補ですfind
。
#!/usr/bin/env bash
shopt -s extglob globstar nullglob
for x in **/files/*; do
[[ -f "$x" ]] && ./stagger <"$x"
done