2014-12-03 67 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