假设我有一个/data/something
包含以下子目录的目录:
/data/something/iowa
/data/something/wyoming
/data/something/burkinafaso
/data/something/slovenia
所有四个子目录都有内容。burkinafaso
和slovenia
是挂载点;iowa
并wyoming
没有。我想以这样的方式复制目录结构,即iowa
和wyoming
与其所有子树一起递归复制,但burkinafaso
和slovenia
被复制为空。与和cp
不同,似乎没有这样的开关。做我想做的事的最好方法是什么?du -x
find -xdev
答案1
在装有 GNU Coreutils(大多数 Linux 发行版)的机器上,该cp
命令具有-x
.
来自 cp 手册页:
-x, --one-file-system
答案2
rsync
有
-x, --one-file-system don't cross filesystem boundaries
-x, --一个文件系统
这告诉 rsync 在递归时避免跨越文件系统边界。这并不限制用户指定从多个文件系统复制的项目的能力,只是 rsync 在用户指定的每个目录的层次结构中进行递归,以及删除期间接收端的类似递归。另请记住,rsync 将同一设备的“绑定”挂载视为位于同一文件系统上。
如果重复此选项,rsync 会忽略副本中的所有安装点目录。否则,它会在遇到的每个安装点处包含一个空目录(使用已安装目录的属性,因为底层安装点目录的属性不可访问)。
如果 rsync 被告知折叠符号链接(通过 --copy-links 或 --copy-unsafe-links),则另一个设备上目录的符号链接将被视为挂载点。到非目录的符号链接不受此选项的影响。
(来源:man rsync)
并且源和目标都允许是本地的。据我所知,rsync
s--archive
选项似乎与 s 匹配,保留了您有权保留的几乎所有内容。cp