将两个目录之间的差异复制到一个新目录?

将两个目录之间的差异复制到一个新目录?

对一个仓促提出的问题进行了编辑!

当我在两个目录上运行 diff 时,例如:$ diff Linux1 Linux2

输出为 $ 仅在 Linux2 中:COMPLETELYDIFFERENT22.txt

我想将该文件(而不仅仅是输出)复制到在同一命令中创建的新目录中。我多次见过这个问题,但没有一个答案有效!我确信答案非常简单,但我似乎找不到它。

答案1

如果我理解正确的话,您想要比较两个目录中的文件,并将具有不同内容的文件复制到第三个目录。我看不出只用一个命令就能做到这一点的方法(除非您编写自己的脚本或函数)。但 bash shell 的一个优点是您可以链接命令,使用一个命令的输出作为下一个命令的输入。

首先,您可以照常使用 diff:

diff -q dir1/ dir2/

这将给你一个输出

Files dir1/file2.txt and dir2/file2.txt differ
Files dir1/file3.txt and dir2/file3.txt differ

现在,您需要从该输出中提取文件路径。您可以使用许多命令来执行此操作,、、cut或其他。我将在此示例中使用并grep从中提取文件:sedawkawkdir2

diff -q dir1 dir2 | awk -n '{ print $4 }'

该管道的输出类似于

dir2/file2.txt
dir2/file3.txt

xargs该输出现在可以按如下方式输入:

diff -q dir1 dir2 | awk -n '{ print $4 }' | xargs -d '\n' -I {} cp {} target-dir/

请注意,此方法仅在两个目录中存在不同的文件时才有效。如果某个文件只存在于两个目录中的其中一个,则diff输出将不同,这将导致文件名剪切失败。此外,文件名不能包含任何空格,因为这也会使剪切失败。

答案2

我知道这是一篇非常古老的帖子,但如果有人发现它,那么有一种适用于任何操作系统的更简单的方法:

进入源目录

使用文件重命名器将 zzzzz 添加到所有文件的开头

将文件复制到目标目录,跳过现有文件

目标目录中的所有不同文件现在将以 zzzzz 开头...

享受

相关内容