给定两个目录,我怎么知道哪些子目录不同?

时间:2013-02-03 22:14:39

标签: bash directory compare diff patch

我有两个目录directorydirectory.original。我想知道哪些子目录不同,从每个不同的目录而不是一个大补丁创建补丁。

1 个答案:

答案 0 :(得分:1)

我发现也许这不是更优雅的方式,当您尝试修补某些源代码时效果很好:

diff -qr directory directory.original | cut -d' ' -f2 | xargs dirname | uniq

让我们研究一下这段代码:

  • diff -qr dir dir.original:将两个目录与​​简短标志(-q)进行比较,这使得diff不会输出实际差异,而只是发布文件。 -r是将diffing递归到其子目录中。

  • cut -d' ' -f2diff -qr的默认输出类似于:

      

    Files dir/file1 and dir.original/file1 differ

         

    Files dir/sub-dir/file2 and dir.original/sub-dir/file2 differ

         

    Files dir/sub-dir/file3 and dir.original/sub-dir/file3 differ

    使用cut命令选择分隔符作为空格(-d' '),然后选择第二个字段,在本例中为dir/file1

  • xargs dirname:为每个“行”运行dirname命令,以便您可以删除文件名。现在您有dirdir/sub-dirdir/sub-dir(因为该子目录中有2个不同的文件)。

  • uniq:如果有多个不同的(子)目录,只需列出一个。

在实际创建补丁时必须小心,请记住,不要在根(-r)上使用dir/标志,因为您将创建一个大补丁。

directories=$(diff -qr directory directory.original | cut -d' ' -f2 | xargs dirname | uniq)
for dir in $directories; do
  subdirectory=$(basename $dir)
  echo "+ $dir"
  diff -Naur directory.original/$subdirectory directory/$subdirectory > ${$subdirectory}.patch
done