我有一个大约 100 GB 的目录。我需要将此目录复制到其他位置,跳过特定文件夹(有很多文件夹)。下面是一个错误的代码来演示我的需求。
$ cp -r ~/directory_to_copy /path/to/copy --skip=foo --skip=bar
该命令有一个结果示例。原始目录树是
~/directory_to_copy
aaa
foo
doo
bar
bbb
ccc
ddd
bar
eee
复制的树是
/path/to/copy/
aaa
doo
bbb
ccc
ddd
eee
如何为我的目的编写命令?
答案1
你要rsync
:
rsync -va --exclude=foo --exclude=bar ~/directory_to_copy /path/to/copy
--exclude
用于排除不需要的文件或目录。
-v
使 rsync 变得详细(可选)。
-a
告诉 rsync 递归复制并保留文件属性。这是可选的,但如果您不使用-a
,您可能希望使用-r
递归复制。
对于更复杂的要求,可以指定排除和包含选项。甚至可以通过指定选项-F
并将.rsync-filter
文件放置在源目录层次结构中的不同位置,将排除/包含设置从一个目录更改为另一个目录。 man rsync
有详细信息。
答案2
你可以用find
它
find -depth ! -wholename '*foo*' ! -wholename '*bar*' -exec cp --parents '{}' /target/dir/ \;
请注意,您将 a) 需要-depth
确保首先找到需要省略的目录,b) 在复制时使用--parents
选项cp
创建完整路径。
然而,这也会跳过空文件夹,因为-r
不能cp
使用,因为一旦 find 到达 ./firstDIR ,所有文件都会被复制。