使用 rsync 将所有特定文件复制到一个文件夹中 - 无需查找命令

使用 rsync 将所有特定文件复制到一个文件夹中 - 无需查找命令

虽然有很多 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/

但是,这并不能让您检查匹配路径名的文件类型,并且它只会匹配非隐藏名称。在zshshell 中,您只能source-dir/**/*.mp3(.D)选择(可能是隐藏的)常规文件。在bashshell 中,您需要迭代匹配的路径名并使用 test 来测试每个路径名-f。您还必须设置dotglobshell 选项以匹配隐藏名称。

相关内容