我在 Linux 中有两个具有以下结构的目录 images 和 images2:
/images/ad
/images/fe
/images/foo
...以及其他 4000 个文件夹
另一个是这样的:
/images2/ad
/images2/fe
/images2/foo
...以及其他 4000 个文件夹
这些文件夹中的每一个都包含图像,并且images和images2下的目录名称完全相同,但内容不同。然后我想知道如何将 /images2/ad 的图像复制合并到 images/ad 中,将 /images2/foo 的图像复制合并到 images/foo 中,等等,以及所有 4000 个文件夹。
答案1
这是一份工作同步。使用 shell 循环手动执行此操作没有任何好处,除非您想要移动文件而不是复制它们。
rsync -a /path/to/source/ /path/to/destination
在你的情况下:
rsync -a /images2/ /images/
(注意 上的尾部斜杠images2
,否则它将复制到/images/images2
。)
如果两个目录中都存在同名图像,上面的命令将/images/SOMEPATH/SOMEFILE
覆盖/images2/SOMEPATH/SOMEFILE
.如果您只想替换较旧的文件,请添加选项-u
。如果您想始终保留该版本/images
,请添加该选项--ignore-existing
。
如果你想使用 rsync 来移动文件/images2
,你可以传递选项--remove-source-files
。然后 rsync 依次复制所有文件,并在完成后删除每个文件。如果源目录和目标目录位于同一文件系统上,这比移动要慢得多。
答案2
正如已经发布的,最好的选择当然是rsync
。不过,这也是unison
完成这项工作的一个很好的软件,尽管通常需要安装软件包。两者都可以在多种操作系统中使用。
同步
rsync 从源到目标单向同步。因此有以下声明
rsync -avh --progress Source Destination
同步所有内容来源到目的地。合并的文件夹位于目的地。
-A意思是“存档”,并将所有内容从源递归复制到目的地,保留几乎所有内容。
-v提供更多输出(“详细”)。
-H供人类可读。
- 进步显示完成了多少工作。
如果你只想更新这目的地文件夹与较新的源文件夹中的文件:
rsync -avhu --progress source destination
齐奏
unison 在两个方向上同步。因此,以下语句
unison Source Destination
双向同步两个目录,最终源等于目标。这就像从源到目标执行 rsync 两次,反之亦然。
有关更高级的用法,请参阅手册页或以下网站:
答案3
有更快、更节省空间的方法可以使用选项来合并两个目录--link
,cp
如果目录是在同一文件系统上,在相关文章中的多个不同答案中进行了描述:(文章的标题与用户的问题并不完全匹配,并且答案解决了标题主题、合并的问题,而不是解决了用户的实际问题。)
选项--link
表示cp
不复制文件数据。一个例子是,其中的所有内容/images2
都替换了其中的任何旧项目/images
:
cp --force --archive --update --link /images2/. /images
合并到后/images
,你可以rm -rf /images2
如果文件树中的任何位置合并尝试将目录合并到具有相同名称的现有文件或符号链接,即它不会将指定的目录合并/images2/x
到具有相同名称的现有文件或符号链接/images/x
,并且如果您遇到这样的错误,您可以手动删除文件或符号链接,然后重新运行命令。
好处是--link
没有数据被移动来合并目录。
答案4
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done
使用扩展的 glob循环遍历所有内容images2
(以避免解析问题ls
),然后将mv
这些项目的内容添加到 中的匹配条目images
。用于从通配路径中basename
去除前导。images2