2012-03-28 3 views
2

私は一時的にfolowingを達成するのに苦労しています。ファイル。一時ファイルを使用せずにbashで2つのtarファイルを比較するには?

#!/bin/bash 
tar ztf "$1" | sort > tmp1 
tar ztf "$2" | sort > tmp2 
comm -1 -3 tmp{1,2}|while read line; do echo -e "$1: $line\n"; done 
comm -2 -3 tmp{1,2}|while read line; do echo -e "$2: $line\n"; done 
rm tmp{1,2} 

tmpファイルなしでこれを行うにはどうすればよいですか?

+0

(また、単にさておきとして、1が一時ファイルを作成するためにmktempを使用する必要があります)、および'むしろ不器用に置き換えるとwhile'ループsedスクリプト。 'comm -3 one two | sed -e "s/^ \ t \/$ 1:/; t; s/\\ t $ //; s/^ $ 2:/" | (あなたの 'sed'が' \ t'をタブとして解釈しない場合は、リテラルタブを使用します)。 – tripleee

答えて

4

各テンポラリファイルを2回使用しているので、答えはほぼ確実です。ただし、場合は、次のように動作するはずです(例えばcommそれ自体で、またはdiff)単一のコマンドを使用するようにスクリプトを変更:

diff <(tar ztf "$1" | sort) <(tar ztf "$2" | sort) 

これはprocess substitutionを使用しています。

あなたは、単一の `comm`呼び出しを使用することができ、マイナーな最適化として

+0

それは助けてくれました。私は、あなたがtarのオプションとしてztfのスペルを間違えていることをほとんど確信しています。 grepを使用してこの結果を変更するにはどうすればよいですか? – user90100

+0

@ user90100、yepは入力ミスを修正しました。 grepは他の状況でも使用できます。つまり、パイプでのみ使用できます: 'diff [...] | grep 'パターン' '。 – huon

関連する問題