findは、-pathや-iregexなどの文字列変数のスペースを処理できません。

findは、-pathや-iregexなどの文字列変数のスペースを処理できません。

-pathまたは-iregex検索オプションの文字列変数にスペースを含めることはできません。
この入力は'/home/demo.*/\.config/File System/.*t$'
次に供給されます。

read i


m="-iregex $i"
find ~ $m

変数では
なく定数であれば動作しないので、いいえ、正しい解決策は何ですか?find ~ \'$m\'eval find ~ \'$m\'

答え1

データを含む文字列変数に操作を入れないでください(参照:バッシュFAQ 50)。変数を使用するときは常に二重引用符を使用してください。

i='/home/demo.*/\.config/File System/.*t$'
find ~ -iregex "$i"

-iregex空でない場合に一意の項目を含めるには、$i次のようにします。維持しますが、正規表現を次のように置き換えます.*(たとえば、何でも)。

find ~ -iregex "${i-.*}"

bash(しかし)shなどの配列を理解するシェルを使用している場合は、-iregex必要なときにのみ含めるようにシェルを使用できます。

IFS= read -r i

findRegex=()
[[ -n "$i" ]] && findRegex=('-iregex' "$i")

find ~ "${findRegex[@]}"

ここで何が起こっているのかを確認するには、読み取りと検索を編集するか、find役立つことがあります。echo findman bashArrays@

read iまたに変更しましたIFS= read -r i。これにより、シェルが入力データを解析できなくなり、複数の$IFSスペース(正確には文字)やその他の文字の組み合わせを含む式が壊れる可能性があります。

関連情報