bash - 从文件中复制文件夹,但文件中的子文件夹除外
问题描述
我想复制一些目录和文件。我已经列出了它们(绝对路径),但其中一些包含我不想要的文件夹(不包括也具有绝对路径的文件夹)。我只想复制包含和更深的内容(不包含在排除中提到的文件/文件夹),但是这个以及我制作的其他版本似乎运行不佳。
rsync -rz --exclude-from="$exclude" --include-from="$include" . $repository_path
假设这就是文件结构
文件包含有两行:
/a
/b
文件排除:
/a/aa
和所需的输出:
解决方案
让我们用你的文件结构来研究它。首先,我们创建 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 /a
with /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
推荐阅读
- flutter - 如何安全地将 Intl.numberFormat 反转回原始数字格式
- java - 为什么我的应用程序名称与活动名称相同?
- php - 在php中读取文本文件的行和列
- mysql - 需要一个 mysql 查询来对每一行求和,其前一行包含日期和 id
- node.js - 如何从 HTML 文本框中获取输入并将其存储在 Node.js 中的变量中?
- javascript - 通过引用更改输入值
- purescript - 如何将新字段添加到 Purescript 中的对象
- vba - 在幻灯片放映期间取消宏操作
- python - 如果没有足够的参数,我如何告诉 argparse 不要退出?
- matlab - MatLab ODE45 中的重复方程求解