首页 > 解决方案 > 从文件中复制文件夹,但文件中的子文件夹除外

问题描述

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

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

在此处输入图像描述

假设这就是文件结构

文件包含有两行:

/a
/b

文件排除:

/a/aa

和所需的输出:

在此处输入图像描述

标签: bashrsynccopying

解决方案


让我们用你的文件结构来研究它。首先,我们创建 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/***
- *

man rsync有关手册 ( ) 中包含/排除文件语法的更多信息INCLUDE/EXCLUDE PATTERN RULES

您必须包含每个目录及其祖先,以便可以同步。这就是为什么包含/and /awith /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

推荐阅读