![将两个目录之间的差异复制到一个新目录?](https://linux22.com/image/1153184/%E5%B0%86%E4%B8%A4%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B9%8B%E9%97%B4%E7%9A%84%E5%B7%AE%E5%BC%82%E5%A4%8D%E5%88%B6%E5%88%B0%E4%B8%80%E4%B8%AA%E6%96%B0%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
对一个仓促提出的问题进行了编辑!
当我在两个目录上运行 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
从中提取文件:sed
awk
awk
dir2
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 开头...
享受