2 つの find コマンド出力を単一の変数に追加しますが、ファイルには追加しません。

2 つの find コマンド出力を単一の変数に追加しますが、ファイルには追加しません。

私のユースケースは、2つの検索コマンドをファイルの代わりに単一の変数として出力することです。試してみて動作しないことがわかったいくつかの点は次のとおりです。

実際のfindコマンドは次のとおりです。

find /opt/apps -xdev -type f -name '*vunn*-2*jar'
find /opt/apps -xdev -type f -name '*robj-2*jar'

オプション1:2番目の出力のみを保存します。

temp_jars=$(find /opt/apps -xdev -type f -name '*vunn*-2*jar')
temp_jars=$(find /opt/apps -xdev -type f -name '*robj*-2*jar')

オプション2:基準引用する、以下で試しましたが、最初のコマンドのみが実行されました。

export temp_jars="$(find /opt/apps -xdev -type f -name '*vunn*-2*jar' && find /opt/apps -xdev -type f -name '*robj-2*jar')"

ご協力ありがとうございます。

答え1

これを行う方法はいくつかあります。あなたの場合、最も簡単な方法はコマンドを組み合わせてfind全体の問題を避けることです。

temp_jars=$(find /opt/apps -xdev -type f \( -name '*vunn*-2*jar' -o -name '*robj-2*jar' \)

実際に複数のコマンドが必要な場合は、コマンドを個別に実行してから追加上書きする代わりに変数として出力します(これは実行してから実行する操作で、foo=bar最初foo=bazの変数を上書きするため、最後の変数のみを保持します)。

$ var=$(echo foo)
$ var="$var $(echo bar)"
$ echo "$var"
foo bar

または 1 つの手順で実行します。

$ var="$(echo foo; echo bar)"
$ echo "$var"
foo
bar

&&(代わりに)を使用した方法は、;最初のコマンドが成功した場合にのみ2番目のコマンドが実行されることを意味します。したがってfind、何らかの理由で最初のコマンドが失敗した場合(find結果がない場合、そのコマンドは失敗し、エラーのみが発生します)、たとえば、存在しないディレクトリから検索するように指示した場合、2番目のディレクトリは実行されません。あなたの場合には&&失敗した理由はありません。うまくいかないのか?

答え2

複数の値を保存するには、スカラー変数の代わりに配列を使用します。

readarray -td '' temp_jars < <(
  find /opt/apps -xdev -type f -name '*vunn*-2*jar' -print0
  find /opt/apps -xdev -type f -name '*robj*-2*jar' -print0
)

-dここでNULを区切り文字として指定するには、bash 4.4以降が必要です。)

ただし、@terdonがすでに述べたように、vunnこれらの項目を前にリストすることが重要でない限り、単一のコマンドでこれを実行できます。robjfind

次に、ファイル名をいくつかのコマンドに別々の引数として渡すには"${temp_jars[@]}"

たとえば、

printf ' * %s\n' "${temp_jars[@]}"

配列変数は使用できませんexport。環境変数は単にスカラーです。 bash変数にはNULバイトを含めることができないため、ファイルパスのリスト(それ自体はnull以外のバイトの(null以外)シーケンスで構成できます)、エンコード形式を使用しない限り、確実に保持することはできません。引用する

また、プロセス交換で開始されたサブシェルの終了状態(この場合はfind2番目のコマンドの終了状態)が失われますが、最新バージョンbashではwait "$!"; status=$?

readarray(別名、mapfile'sとは何の関係もなく、実際にはそうではありませんが、zshmapfileマッピングbash具体的である。ここで同等のものは次zshのとおりです。

temp_jars=(
  ${(0)"$(
    find /opt/apps -xdev -type f -name '*vunn*-2*jar' -print0
    find /opt/apps -xdev -type f -name '*robj*-2*jar' -print0
  )"}
)

0NULを分割するには、パラメータ拡張フラグを使用します。この場合、終了状態は通常$?どおり直接使用できます。

配列に要素を追加するには、sumで次のことができますzshbash

temp_jars+=(more elements)

Bashでは、このオプションを使用して値を格納する配列のインデックスを指定readarrayできます。-O

以下を使用して、配列の最後の割り当てインデックスを取得できます。

indexes=("${!temp_jars[@]}"); last_index=${indexes[-1]}

次に、次を使用します。

readarray -td '' -O "$((last_index + 1))" temp_jars < <(find ... -print0)

配列が最初に稀でない場合(Straight before以降の場合のようにreadarray)、次のように単純化できます。

readarray -td '' -O "${#temp_jars[@]}" temp_jars < <(find ... -print0)

これは${#temp_jars[@]}配列の要素数です(配列インデックスが1ではなく0から始まるため、配列がリーンでない場合は1に最後に割り当てられたインデックスを加えた値に対応します)。

zshのほとんどのシェルと同様に、配列は希薄ではなく、インデックス付けは要素$#temp_jars数と最後の割り当てインデックスで始まります。

関連情報