複数のパターンを含むfindコマンドは出力を返しません。

複数のパターンを含むfindコマンドは出力を返しません。
#!/bin/bash
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path

find $path -type f $open -name $pat $close

上記のコードは find の出力を表示しません。助ける

答え1

pat="'*.ab' -o -name '*.bc'"
find $path -type f $open -name $pat $close

これには望ましい効果はありません。変数の引用符はpat引用符として扱われず、リテラル文字として扱われます。拡張後、単語$pat分割が実行され、単語、および'*.ab'-o重引用符がそのまま残ります。したがって、ファイル名に一重引用符が含まれていない場合は一致しません。-name'*.bc'

path=path

これは変数をpathリテラル文字列に設定しますpathが、これはプレースホルダにすぎないと思います。

open="\("
close="\)"

これは変数にリテラルバックスラッシュを入れてfind引数を受け取ると文句を言うかもしれません\(。括弧を一度だけ引用すれば十分ですopen="("open=\(

式リストを作成する必要がある場合は、配列を含むfindシェルを使用してください(Bashまたは一般以外のほとんどすべてsh)。

args=()  
args+=( -name "*.ab" )
args+=( -or -name "*.bc" ) 

find ... \( "${args[@]}" \)

必要に応じて配列構成をループにラップします。

答え2

間違った型の変数を使用し、それを参照するのを忘れました。

これには、複数のパラメータを格納するための配列が必要です。

#! /bin/bash -
pat=('*.ab' -o -name '*.bc')
open='('
close=')'
path=path

find "$path" -type f "$open" -name "${pat[@]}" "$close"

*.abOR以外のANDパラメータを渡すことに注意してください。これらの引用符とバックスラッシュはシェル構文の一部です。(find'*.ab'\(

evalたとえば、これを評価するためにシェルコマンドラインをビルドする場合にのみこれを実行します。

#! /bin/bash -
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path

eval 'find "$path" -type f '"$open -name $pat $close"

次に、シェルに評価を実行させます。

find "$path" -type f \( -name '*.ab' -o -name '*.bc \)

上記のように、find次のパラメータを使用して呼び出しが発生します。

  • find
  • path(コンテンツ$path
  • -type
  • f
  • (
  • *.ab
  • -o
  • -name
  • *.bc
  • )

答え3

変数を使用する代わりに、単純なアプローチを使用してください。

find $path -type f -name "*.ab" -o \( -name "*.bc" \)

関連情報