![是否有“cp -a”命令的变体可以避免从其他文件系统进行复制?](https://linux22.com/image/72204/%E6%98%AF%E5%90%A6%E6%9C%89%E2%80%9Ccp%20-a%E2%80%9D%E5%91%BD%E4%BB%A4%E7%9A%84%E5%8F%98%E4%BD%93%E5%8F%AF%E4%BB%A5%E9%81%BF%E5%85%8D%E4%BB%8E%E5%85%B6%E4%BB%96%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E8%BF%9B%E8%A1%8C%E5%A4%8D%E5%88%B6%EF%BC%9F.png)
假设我有一个/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