有时我会有两个目录树,它们以前内容相同,但现在却不再同步了(因为我移动了磁盘或其他原因)。一个很好的例子是我从 Fedora 镜像上游软件包的目录树。
我想通过将所有文件从 tree1 移动到 tree2 来再次合并这两棵树。
通常我会这样做:
rsync -arv tree1/* tree2
然后删除tree1。
但是,这会占用大量的时间和磁盘空间,如果能这样做就简单多了:
mv -r tree1/* tree2
换句话说,这是一种递归移动。它会更快,因为首先它甚至不会复制,而只是移动 inode,其次我不需要最后删除。
这个存在吗?
作为测试用例,请考虑以下命令序列:
$ mkdir -p a/b
$ touch a/b/c1
$ rsync -arv a/ a2
sending incremental file list
created directory
./
b/
b/c1
b/c2
sent 173 bytes received 57 bytes 460.00 bytes/sec
total size is 0 speedup is 0.00
$ touch a/b/c2
什么命令现在会将 a/b/c2 移动到 a2/b/c2,然后删除 a 子树(因为其中的所有内容都已在目标树中)?
答案1
根据 gnu 的 mv(1) 手册页mv
:
-u, --update move only when the SOURCE file is newer than the destination file or when the destination file is missing
答案2
建议mv -uf dir1/* dir2/
移动(子)目录,而不是每个文件。您可以尝试使用find
cd dir1
find . -type d -exec mkdir -p dir2/"{}" \;
find . -type f -exec mv -uf "{}" dir2/"{}" \;
或类似的东西
答案3
才不是
mv -uf tree1/* tree2/
工作?
答案4
您可以使用“cp -l & rm”进行设备内移动:
cp -alv --backup=numbered tree1/* tree2 &&
rm -rf tree1/
-l
cp
使用硬链接而不是复制(这也可以防止跨设备操作)--backup=numbered
用于cp
备份目标目录中的现有文件
并要注意以下两个问题:
- 如果您意外地在跨设备目标上运行它,使用它
&&
来防止未复制的数据被删除。(在跨设备情况下cp
以“ ”状态退出1
,至少对于 GNU coreutils 而言) .
中以“ ”开头的文件tree1
,如果有的话,您将丢失它们。