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