4

パラメータfindに対して言及された複数のパターンに一致する名前のファイルを検索するコマンドがあります-name

find -L . \( -name "SystemOut*.log" -o -name "*.out" -o -name "*.log" -o -name "javacore*.*" \)

これにより、コマンドラインで必要なファイルが正常に検出されます。私が探しているのは、シェルスクリプトでこのコマンドを使用し、これをコマンドと結合して、tarすべてのログファイルのtarを作成することです。したがって、スクリプトでは次のようにします。

LIST="-name \"SystemOut*.log\" -o -name \"*.out\" -o -name \"*.log\" -o -name \"javacore*.*\" "
find -L . \( ${LIST} \)

これは私が探しているファイルを印刷しません。

まず、なぜこのスクリプトがコマンドのように機能しないのですか?それができたら、それをクラブcpioまたは同様のものにしてtar、ワンショットで作成できますか?

4

6 に答える 6

7

引用符で囲まれていない変数のパターンでfind一致しないようです。*この構文は私にとってはうまくいきます(bash配列を使用):

LIST=( -name \*.tar.gz )
find . "${LIST[@]}"

あなたの例は次のようになります:

LIST=( -name SystemOut\*.log -o -name \*.out -o -name \*.log -o -name javacore\*.\* )
find -L . \( "${LIST[@]}" \)
于 2012-04-26T21:45:56.827 に答える
1
eval "find -L . \( ${LIST} \)"
于 2012-04-26T21:45:48.807 に答える
1

使用するファイル名のリストが長い場合は、代わりに次の構文を試してください。

# List of file patterns
Pat=( "SystemOut*.log"
"*.out"
"*.log"
"javacore*.*" )

# Loop through each file pattern and build a 'find' string
find $startdir \( -name $(printf -- $'\'%s\'' "${Pat[0]}") $(printf -- $'-o -name \'%s\' ' "${Pat[@]:1}") \)

このメソッドは、リストの要素を使用して引数を順番に作成します。これは、(少なくとも最近の経験では)うまく機能する傾向があります。

findの-execオプションを使用して、結果をアーカイブプログラムに渡すことができます。

find -L . \( .. \) -exec tar -Af archive.tar {} \;
于 2012-04-26T21:46:52.440 に答える
1

evalとxargsを使用できます。

eval "find -L . \( $LIST \) " | xargs tar cf 1.tar
于 2012-04-26T21:49:06.247 に答える
0
LIST="-name SystemOut*.log -o -name *.out -o -name *.log -o -name javacore*.*"

ワイルドカードはすでに引用されているため、再度引用する必要はありません。また、ここ

LIST="-name \"SystemOut*.log\""

内部引用符は保持されfind、引数の一部として取得されます。

于 2012-04-26T21:53:33.983 に答える
0

コマンドの-name作成リストfind

これを行う適切な方法は次のとおりです。

cmd=();for p in \*.{log,tmp,bak} .debug-\*;do [ "$cmd" ] && cmd+=(-o);cmd+=(-name "$p");done

または

cmd=()
for p in \*.{log,tmp,bak,'Spaced FileName'} {.debug,.log}-\* ;do
    [ "$cmd" ] && cmd+=(-o)
    cmd+=(-name "$p")
done

$cmd配列をダンプできます:

declare -p cmd
declare -a cmd=([0]="-name" [1]="*.log" [2]="-o" [3]="-name" [4]="*.tmp" [5]="-o"
     [6]="-name" [7]="*.bak" [8]="-o" [9]="-name" [10]="*.Spaced FileName" 
     [11]="-o" [12]="-name" [13]=".debug-*" [14]="-o" [15]="-name" [16]=".log-*")

その後、今あなたはできます

find [-L] [/path] \( "${cmd[@]}" \)

として

find \( "${cmd[@]}" \)

(注:パスが送信されない場合、現在のパス.がデフォルトです)

find /home/user/SomeDir \( "${cmd[@]}" \)

find -L /path -type f \( "${cmd[@]}" \)
于 2021-08-08T08:19:10.260 に答える