递归复制跳过具有特定名称的目录

递归复制跳过具有特定名称的目录

我有一个大约 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 ,所有文件都会被复制。

相关内容