コマンド出力の2つのファイルの比較 [閉じる]

コマンド出力の2つのファイルの比較 [閉じる]

現在のディレクトリにはXMLファイルがたくさんあります。

質問1.

私が読んだところによれば、evalは結果を返し、それを変数に保存します。ただし、次のコマンドの使用中にエラーが発生します。

find ./ -name '*.xml' | file=$(eval awk '{print $0}') ; echo $file

編集(CASが指摘したように評価を省略した後) -

eval を省略すると、単に空の文字列が返されます。

find ./ -name '*.xml' | file=$(awk '{print $0}') ; echo $file

質問2.

私はちょうどbashを学びたかったので、最初の2つのファイルをfindの出力と比較する複雑なシーケンスを作成しました。複雑な順序は、単にbashプログラミングの概念を理解することです。

find ./ -name '*.xml' | file=$(awk '{print $0}') ; echo $file && diff -y $(sed '2q;d' $file) $(sed '1q;d' $file)

答え1

以下は、bashで配列を使用してこれを行う1つの方法の非常に簡単な例です。

#!/bin/bash

IFS=$'\n' files=( $(find . -name '*.xml' | head -n 2) )

if [[ -n ${files[0]} && -n ${files[1]} ]] ; then
  diff "${files[0]}" "${files[1]}"
fi

その後、find ... | head -n 2コマンドが実行され、各行(返されたファイル名)が配列に保存されます$files。最初の2つの配列要素(0と1)が空でない場合は、そのファイル名を使用してdiffを実行します。

ディレクトリまたはファイル名に改行文字が含まれていると中断される可能性があります。

答え2

あなたはそれを使用することができます:

diff "$(find . -type f -name 'diff')" "$(find . -type f -name 'diff2')"

このように検索してください違いファイル、検索違い2ファイルを比較して違いツール。

答え3

許可された回答を拡張し、全体的な理解を助けるために私の回答を投稿しています。

問題1の解決策。

最初の問題はevalの使用です。ここではevalは必要ありません。コマンドの置換には $(...) を使用すれば十分です。

find ./ -name '*.xml' | files=$(awk '{print $0}') ; echo $files

2番目の問題はパイプです。 @casが指摘したように、パイプは独自のサブシェルで実行されます。したがって、変数ファイルは空です。この問題を解決するには、awk を削除し、 find 結果を変数に直接保存します。

files=$(find ./ -name '*.xml') ; echo "${files}" 

しかし、上記のコマンドは配列ではありません。配列にするには括弧を使用してください。

files=($(find ./ -name '*.xml')) ; echo "${files[0]}" 

する必要があります。 ${files}変数に二重引用符を使用することをお勧めします。そうしないと、ファイル名にスペースが含まれていると問題が発生する可能性があります。それに加えて、次の良い方法はIFSを使用することです。これにより、シェルはスペースやタブでトークン化されません。IFS=$'\n'トークン化は、$files変数に内容を保存する前に、新しい行(findの出力)で行われます。

IFS=$'\n' files=($(find ./ -name '*.xml')) ; echo "${files[0]}" 

したがって、2つのファイルまたは任意の2つのファイルを比較する最後のコマンドは次のようになります。

files=($(find . -name '*.sh')) ; echo "${files[0]}" ; diff -y "${files[0]}" "${files[1]}"

ここで、0 と 1 は配列 ( $files ) の有効な数値で置き換えることができます。

関連情報