2012-03-28 80 views
2

我很努力地實現沒有臨時工出現。文件。如何比較bash中的兩個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

作爲一個小的優化,你可以使用一個'comm'調用,並更換相當笨拙'while'循環用sed腳本。 'comm -3 one two | sed -e「s/^ \ t \/$ 1:/; t; s/\\ t $ //; s/^ $ 2:/」| sort'(如果你的'sed'不把'\ t'解釋爲標籤,使用文字標籤)。 – tripleee 2012-03-28 14:07:53

回答

4

由於您使用每個臨時文件兩次,答案几乎肯定不是。但是,如果您修改腳本使用單個命令(例如comm本身,或diff)那麼下面應該工作:

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

這使用process substitution

(而且,正如順便說一句,應該使用mktemp創建臨時文件)

+0

那一個幫助。我幾乎可以肯定,你拼錯了ztf作爲tar的選項。 我如何使用grep來修改這個結果? – user90100 2012-03-28 20:48:00

+0

@ user90100,yep修正了錯字。你可以像在其他任何情況下一樣使用grep,也就是使用pipe:'diff [...] | grep'pattern''。 – huon 2012-03-29 00:35:03