我正在尝试仅 rsync 以 11.* 和 14.* 开头的文件夹(包括子文件夹)中的 .bin 文件,且时间不超过 1 天。
到目前为止我已经尝试过:
rsync -Rarv `find /mnt/IP/ftp/123/ -type f -mtime -1` --prune-empty-dirs --include "1[1][4]./" --include="*.bin" --exclude="*" "/mnt/IP/ftp/123/" "/home/ftp/123/"
它通常有效,但 Rsync 在目标内部创建了一个同名的目录:/home/ftp/123/mnt/IP/ftp/123/
所以我正在寻找仅重新创建以 11.* 或 14.* 开头的文件夹的解决方案
答案1
此答案未考虑“不超过 1 天”的限制。
而不是尝试解析输出find
,rsync
直接使用从 find
:
find /mnt/IP/ftp/123 -type -name '1[14].*' -prune \
-exec rsync -av \
--include='*.bin' --include='*/' \
--exclude='*' --prune-empty-dirs {} /home/ftp/123 ';'
这将找到名称以 或11.
in14.
或 under开头的目录/mnt/IP/ftp/123
。对于每个这样的目录,它将从搜索列表中删除该目录(使用-prune
),然后执行
rsync -av --include='*.bin' --include='*/' \
--exclude='*' --prune-empty-dirs {} /home/ftp/123
其中{}
将替换为找到的目录的路径名。
该rsync
命令将创建一个/home/ftp/123
与找到的目录具有相同文件名的子目录(即以11.
或开头14.
),然后复制.bin
文件。
使用的包含和排除模式rsync
(第一场比赛获胜):
--include='*.bin'
:包含文件名以 . 结尾的任何文件.bin
。--include='*/'
: 包括任何目录。目标处的空目录将由于--prune-empty-dirs
.--exclude='*'
:排除先前规则中未包含的任何内容。
答案2
您可以用来find
构建满足三个条件的文件集:
- 不超过一天
- 必须位于匹配
11.*
或的目录中14.*
- 文件匹配
*.bin
然后将该列表提供给rsync
进行处理:
find mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print0 |
rsync -av --files-from - --from0 --prune-empty-dirs / dst/
我已经使用-print0
和-from0
来确保名称中包含意外字符的文件得到正确处理。路径/./
中的extrafind
表示rsync
该组件之前的所有内容都将从目标路径中删除。 (如果您决定使用相对路径find
(即不以 开头的路径/
),则将rsync
源从更改/
为.
。)
示例场景
# All files in the example
find /mnt/IP/ftp/123/./ -type f
/mnt/IP/ftp/123/./11.one/7.skip/skip.bin
/mnt/IP/ftp/123/./11.one/item.bin
/mnt/IP/ftp/123/./12.skip/item.bin
/mnt/IP/ftp/123/./14.one/item.bin
/mnt/IP/ftp/123/./item.bin
/mnt/IP/ftp/123/./sub/13.skip/item.bin
/mnt/IP/ftp/123/./sub/14.next/item.bin
/mnt/IP/ftp/123/./sub/14.next/skip.this
/mnt/IP/ftp/123/./sub/item.bin
# Files matched by "find"
find mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print
/mnt/IP/ftp/123/./11.one/item.bin
/mnt/IP/ftp/123/./14.one/item.bin
/mnt/IP/ftp/123/./sub/14.next/item.bin
# Files copied by "rsync"
find /mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print0 |
rsync -av --files-from - --from0 --prune-empty-dirs / dst/
building file list ... done
11.one/
11.one/item.bin
14.one/
14.one/item.bin
sub/
sub/14.next/
sub/14.next/item.bin