虽然有很多 rsync 示例,但我的问题是:是否有一个仅 rsync 的命令行,可以将某些文件类型(例如 .mp3)复制到一个文件夹中!而不使用任何 find 命令!并且!没有任何!重新创建 dest 文件夹上的 dir 结构? (即使这会导致一个巨大的目录?)
答案1
无法将rsync
文件从目录层次结构递归复制到单个平面目录中。这是最简单的方法,使用find
:
find source-dir -name '*.mp3' -type f -exec cp {} dest-dir/ \;
上面的代码查找source-dir
名称以 结尾的任何常规文件.mp3
,并将其复制到dest-dir
(不处理名称冲突)。
使用 GNU 工具,可以提高效率,从而cp
尽可能减少调用次数:
find source-dir -name '*.mp3' -type f -exec cp -t dest-dir/ {} +
当然,没有什么可以阻止您调用rsync
来代替:cp
find source-dir -name '*.mp3' -type f -exec rsync -a {} dest-dir/ \;
或者,更有效地,
find source-dir -name '*.mp3' -type f -exec sh -c 'rsync -a "$@" dest-dir/' sh {} +
如果您可以保证您的文件少于几千个,并且您有一个支持**
文件名通配模式的 shell(如shopt -s globstar
中所示bash
):
rsync -a --no-r source-dir/**/*.mp3 dest-dir/
但是,这并不能让您检查匹配路径名的文件类型,并且它只会匹配非隐藏名称。在zsh
shell 中,您只能source-dir/**/*.mp3(.D)
选择(可能是隐藏的)常规文件。在bash
shell 中,您需要迭代匹配的路径名并使用 test 来测试每个路径名-f
。您还必须设置dotglob
shell 选项以匹配隐藏名称。