Unix 上的递归移动实用程序?

Unix 上的递归移动实用程序?

有时我会有两个目录树,它们以前内容相同,但现在却不再同步了(因为我移动了磁盘或其他原因)。一个很好的例子是我从 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/
  • -lcp使用硬链接而不是复制(这也可以防止跨设备操作)
  • --backup=numbered用于cp备份目标目录中的现有文件

并要注意以下两个问题:

  • 如果您意外地在跨设备目标上运行它,使用它&&来防止未复制的数据被删除。(在跨设备情况下cp以“ ”状态退出1,至少对于 GNU coreutils 而言)
  • .中以“ ”开头的文件tree1,如果有的话,您将丢失它们。

相关内容