linux - 复杂的 rsync 过滤(包括和排除)

标签 linux unix rsync

我得到的目录和文件看起来像这样

/1.txt
/2.txt
/3.txt
/20170407_000000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170407_120000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170408_000000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170408_120000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170409_000000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170409_120000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170410_000000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170410_120000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170411_000000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170411_120000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170412_000000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt
/20170412_120000
    /config
       file1.txt
    /logs
       file1.txt
    /nav
       file1.txt
    /schedule
       file1.txt
       file2.txt
       file3.txt
    /soh
       file1.txt
    /tracks
       file1.txt

我只想复制 20170409_*/schedule、20170410_*/schedule、20170411_*/schedule 文件夹和内容。

这主要有效:

 rsync -avhr --progress  --include="/20170409_*/schedule/" --include="/20170410_*/schedule/" --include="/20170411_*/schedule/"  --exclude="/*/*"  /source/dateTimeDirectories/ /destination/dateTimeDirectories/

但是这也会复制以下内容:

1.txt
2.txt
3.txt
20170407_000000/
20170407_120000/
20170408_000000/
20170408_120000/
...
20170412_000000/
20170412_120000/

如何省略我没有包含的文件和 dateTimeFolders,只得到我包含的 dateTimeFolder 的日程文件夹?

最佳答案

如果我理解正确的话,你需要在你的命令中添加选项--prune-empty-dirs(简而言之,-m)。这些目录与排除其子项的排除规则不匹配,因此默认情况下会复制它们。 -m 可以防止这种情况。如果要防止其他文件被复制,则必须为它们添加特定的排除规则。例如1.txt2.txt等文件可以通过--exclude=/*.txt排除。总之,您的命令应如下所示:

 rsync -avhr \
   --progress \
   --prune-empty-dirs \
   --include="/20170409_*/schedule/" \
   --include="/20170410_*/schedule/" \
   --include="/20170411_*/schedule/" \
   --exclude="/*.txt" \
   --exclude="/*/*"  \
   /source/dateTimeDirectories/ \
   /destination/dateTimeDirectories/

关于linux - 复杂的 rsync 过滤(包括和排除),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43331235/

相关文章:

linux - Apache 2.2 403 访问 .sh 文件时被禁止

macos - 'whoami' 在 mac 终端上不工作

python - 任何人都可以将此 rsync 命令解析为与 asyncio.subprocess 一起使用的列表吗?

emacs - 使用 emacs tramp 与 rsync 进行远程开发

python - 如何在终端命令中在 python 中分配变量值?

php - 加载 gRPC 二进制模块失败(gRPC php 教程)

c - 如何调用使内核模块调用或禁用中断?

c - fork 两个子进程,一个计算 N 的和,另一个计算 N 的阶乘

调用memset导致segmentation fault

git - 如何同步 git-svn 存储库