2012-03-28 12 views
2

Ich kämpfe um Folowing ohne Temp zu erreichen. Dateien.Wie zwei tar-Dateien in bash zu vergleichen, ohne temporäre Dateien zu verwenden?

#!/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} 

, wie diese Dateien ohne tmp zu tun?

+0

Als kleinere Optimierung Sie einen einzelnen 'comm' Aufruf verwenden könnten, und ersetzen Sie das eher ungeschickt' while' Schleife mit einem sed-Skript. 'comm -3 eins zwei | sed -e "s/^ \ t \/$ 1: /; t; s/\\ t $ //; s/^ $ 2: /" | sort' (Wenn Ihr 'sed'' \ t' nicht als Tab interpretiert, verwenden Sie wörtliche Tabs). – tripleee

Antwort

4

Da Sie jede temporäre Datei zweimal verwenden, ist die Antwort mit ziemlicher Sicherheit nein. Wenn Sie jedoch das Skript ändern, um einen einzigen Befehl zu verwenden (z comm selbst oder diff), dann sollten folgende Arbeiten:

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

Dies verwendet process substitution.

(Auch, wie nebenbei bemerkt, soll man mktemp verwenden, um temporäre Dateien zu erstellen)

+0

Das hat geholfen. Ich bin fast sicher, dass Sie ztf als Option für Teer falsch geschrieben haben. Wie kann ich Grep verwenden, um dieses Ergebnis zu ändern? – user90100

+0

@ user90100, yep den Tippfehler behoben. Sie können grep wie in jeder anderen Situation verwenden, d. H. Nur mit pipe: 'diff [...] | grep 'Muster'. – huon