我有两个目录directory
和directory.original
。我想知道哪些子目录不同,从每个不同的目录而不是一个大补丁创建补丁。
答案 0 :(得分:1)
我发现也许这不是更优雅的方式,当您尝试修补某些源代码时效果很好:
diff -qr directory directory.original | cut -d' ' -f2 | xargs dirname | uniq
让我们研究一下这段代码:
diff -qr dir dir.original
:将两个目录与简短标志(-q
)进行比较,这使得diff不会输出实际差异,而只是发布文件。 -r
是将diffing递归到其子目录中。
cut -d' ' -f2
:diff -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
命令,以便您可以删除文件名。现在您有dir
,dir/sub-dir
,dir/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