【问题标题】:Copying folders from file except subfolders from file [closed]从文件中复制文件夹,但文件中的子文件夹除外[关闭]
【发布时间】:2020-08-05 04:59:20
【问题描述】:

我想复制一些目录和文件。我已经列出了它们(绝对路径),但其中一些包含我不想要的文件夹(不包括也具有绝对路径的文件夹)。我只想复制包含和更深的内容(不包括在排除中提到的文件/文件夹),但是这个以及我制作的其他版本似乎运行得不好。

rsync -rz  --exclude-from="$exclude" --include-from="$include" . $repository_path

假设这就是文件结构

文件包含有两行:

/a
/b

文件排除:

/a/aa

以及想要的输出:

【问题讨论】:

  • 你会这么好心并添加示例文件结构和预期结果吗?
  • 我觉得现在好多了。如果您还有任何疑问@DevilaN,我会尽量说清楚

标签: bash rsync copying


【解决方案1】:

让我们用你的文件结构来研究它。 首先我们创建 testsync 目录来播放:

mkdir testsync && cd testsync
mkdir -p a/aa/whatever b/bb c/whatever c/noneed
touch a/file.txt a/picture.jpg b/bb/morefiles.txt b/txt.txt

让我们来看看tree

.
├── a
│   ├── aa
│   │   └── whatever
│   ├── file.txt
│   └── picture.jpg
├── b
│   ├── bb
│   │   └── morefiles.txt
│   └── txt.txt
└── c
    ├── noneed
    └── whatever

我们创建带有内容的include.dat 文件:

- /a/aa/*
+ /
+ /a
+ /a/***
+ /b
+ /b/***
- *

INCLUDE/EXCLUDE PATTERN RULES 部分的手册 (man rsync) 中详细了解包含/排除文件的语法。

您必须包含每个目录及其祖先,以便同步。这就是为什么包含//a 以及/a/***(其中所有目录内容的三个星号)的原因

我们在 testsync 之外创建另一个目录:targetsync 并测试:

rsync -az --include-from=include.dat ~/testsync/ ~/targetsync/

现在当我们进入targetsync目录并使用tree获取图片时:

.
├── a
│   ├── aa
│   ├── file.txt
│   └── picture.jpg
└── b
    ├── bb
    │   └── morefiles.txt
    └── txt.txt

【讨论】:

  • 那很好,但是如果我在不同的位置有大量文件,我不能像你对 /c 所做的那样排除所有我不喜欢的目录
  • 我只想要“包含”中列出的文件和目录及其所有子文件夹和文件,直到结束或文件夹位于“排除”中,其子文件夹不应被复制。
  • @Nav:我已经根据你的建议更改了答案。
  • 这对我来说似乎有点奇怪。如果我们在 test 文件夹中创建一个文件,那么文件 a 的绝对路径不是 /a 而是 (...)/targetsync/a 并且 + 和 - 标记应该在包含文件中?我找不到有关该语法的任何信息,我无法重现您的结果:/
  • @Nav 路径用于相对于源目录的 rsync。我已经一步一步地尝试了我的答案,我的结果是可重现的。是的,+- 表示严格包含路径和排除路径。必须这样做。你到底有什么问题?
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多