rsync 在目标文件夹中创建同名目录

rsync 在目标文件夹中创建同名目录

我正在尝试仅 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

相关内容