2014-12-03 64 views
1

我是Bash新手,需要幫助。比較兩個存檔文件BashShell

我需要創建一個shell腳本來比較兩個gzip壓縮文件。對於每個檔案文件中的每個文件或目錄(即使在已存檔的子目錄中),該腳本應驗證其他檔案中是否存在同名的文件/目錄。在缺少目錄的情況下,忽略該目錄中缺少的文件或子目錄。該腳本應列出在其他檔案中沒有匹配的所有文件的名稱。

比較時檔案arch1.tar.gz和archive2.tar.gz和在archive.tar.gz和c找到不同的文件AA/A.TXT,BB/b.txt腳本的輸出.TXT v arch2.tar.gz

arch1.tar.gz:AA/A.TXT

arch1.tar.gz:BB/b.txt

arch2.tar。 gz:c.txt

在這裏我有什麼:

#!/bin/bash 
$1 
$2 

tar tf $1>> list1.txt 
tar tf $2>> list2.txt 
comm -23 <(sort list1.txt -o list1.txt | uniq) <(sort list2.txt -o list2.txt| uniq) 
diff list1.txt list2.txt>>contestboth 

的事情是,我不能爲輸出圖像的任何東西。

+0

如果使用'-o'進行排序,那麼它不會寫入標準輸出,所以這些'| uniq管道不可能工作。此外,前兩行「$ 1」和「$ 2」正嘗試執行腳本的第一個和第二個參數,作爲可能不是您想要的命令(如果甚至有腳本的參數,他們是)。這就是說我不明白你的最後一句話是什麼意思。 – 2014-12-03 22:04:17

+0

使用選項「-o」與輸出到'uniq'的管道結合是沒有意義的。你應該使用'sort -u',它已經做了uniq功能。 – Alfe 2014-12-03 22:04:56

回答

0

試試這個:

diff <(sort -u list1.txt) <(sort -u list2.txt) 

通過這兩個子進程已經啓動(這兩個命令sort)及其輸出與文件描述符關聯。語法<(...)返回表示此文件描述符的文件名(類似/dev/fd/63)。所以最後,diff被調用了兩個文件,這些文件在讀取時(似乎)包含兩個進程的輸出。

此方法對嚴格線性讀取文件的程序工作正常。當然,在「檔案」中尋找是不可能的。

+2

您可能想要添加有關此命令如何工作的說明。就目前而言,這不是一個好的答案。 – 2014-12-03 23:35:25

+0

是的,我解釋了一下。 – Alfe 2014-12-03 23:54:19