我想在未知的目录结构上运行 rsync,并让它仅同步文件而不同步目录。
我尝试过很多方法,甚至包括通过管道查找,但都没有成功。
示例源目录:
somedir/
file1.txt
file2.txt
anotherdir/
file3.txt
示例目标目录:
file1.txt
file2.txt
file3.txt
答案1
您可以rsync
在非递归模式(不带-r
)中与递归 shell glob 一起使用。这样,您就可以将文件夹中所有文件和子目录的列表作为参数提供给它,但它将忽略所有目录并仅传输文件。
注意:递归通配符 ( **
) 需要globstar
在 Bash 中设置 shell 选项。使用 为当前会话启用它,shopt -s globstar
或者在文件中取消注释该行.bashrc
以永久启用它。
$ tree .
.
└── somedir
├── anotherdir
│ └── file3.txt
├── file1.txt
└── file2.txt
$ rsync ** myserver:/tmp/rsynctest
skipping directory somedir
skipping directory anotherdir
$ ssh myserver tree /tmp/rsynctest
/tmp/rsynctest
├── file1.txt
├── file2.txt
└── file3.txt
如果您想指定rsync
暗示递归的其他参数(例如-a
),您可以再次使用明确禁用递归--no-r
。
递归 glob 也可以是更长路径或更复杂模式的一部分。只需确保包含所需的所有文件,任何目录都将被忽略。
$ rsync -avz --no-r somewhere/local/**/*.txt myserver:/tmp/rsynctest/
skipping directory .
skipping directory somedir
skipping directory anotherdir
file1.txt
file2.txt
file3.txt
sent 231 bytes received 73 bytes 202.67 bytes/sec
total size is 0 speedup is 0.00