对一个仓促提出的问题进行了编辑!
当我在两个目录上运行 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 开头...
享受