我正在尝试编译 CyanogenMod,在供应商文件中,我必须手动找到相同的文件,然后复制它们。在一个文件夹中,有 400 多个文件,逐个复制它们非常困难。
我在想是否有办法选择两个文件夹中的公共文件?这会让我的生活变得轻松很多。
答案1
你可能正在寻找的是:
rsync -a --existing source/ destination
此处,该--existing
选项确保仅从目录中destination
复制目录中已存在的文件source
-a
使复制递归并保留符号链接、特殊文件和设备文件、修改时间、组、所有者和权限
如果您想进行试运行以查看将复制的内容,请使用:
rsync -nav --existing source/ destination
无论哪种情况,请注意指定目标目录后没有斜杠。
答案2
在命令行中您可以使用 MV 命令和一些通配符。
将目录子目录中的所有文件移动到此处
mv dir/*/* here
相同,但仅以前缀开头的文件
mv dir/*/prefix* here
答案3
如果您必须查找相同的文件,也可以查看fdupes
,并解析其输出。它会检查两个(或多个)文件是否真的相同,即使它们的文件名不同。
您可以将它与比较文件名的工具结合起来。
(旁注:使用fdupes
删除冗余文件可能会很危险 - 例如翻录的 DVD。每个 DVD 轨道都有一个字幕文件及其备份,它们是相同的,但具有不同的文件名后缀。如果其中一个文件丢失,VLC 播放器将无法播放 DVD。所以我必须重建这些文件...)
答案4
解决方案:
diff -sqr dir1 dir2 | grep identical | awk '{print $2}'
解释:
diff
可以通过文件名输出差异。示例
diff -sqr dir1 dir2
Files dir1/fileX.txt and dir2/fileY.txt differ
Only in dir1: griveTest.txt
Files dir1/Test.odt and dir2/Test.odt are identical
要仅获取相同的文件,请使用 grep:
diff -sqr dir1 dir2 | grep identical
Files dir1/Test.odt and dir2/Test.odt are identical
现在仅获取文件名用于awk
获取第二列:
diff -sqr dir1 dir2 | grep identical | awk '{print $2}'
dir1/Test.odt