cp 递归使用特定文件扩展名

cp 递归使用特定文件扩展名

我正在尝试复制所有.odt文件,包括子目录中的文件。

cp -r ~/Documents/* ~/copies # works as expected
cp -r ~/Documents/*.odt ~/copies # does not work as expected

第一行将复制所有子目录中的所有文件,但第二行将仅复制其中的文件,.odt而不~/Documents复制子目录中的任何文件。

答案1

您可以让(bash)shell 执行递归:

shopt -s globstar
cp -nt ~/copies/ ~/Documents/**/*.odt

或者使用find命令

find ~/Documents -name '*.odt' -exec cp -nt ~/copies/ {} +

ARG_MAX如果文件数量非常大,前者可能会超出系统的限制,而后者会将命令分解以保持在范围内ARG_MAX

我添加了-n防止“破坏”同名文件的选项。

答案2

如果你希望复制目录结构(更像cp -rsteeldriver 所建议的)但只用文件填充.odt,您可以使用 来执行此操作rsync,其中-f是“过滤器”选项。其他选项更直接。您可以在 中找到所有选项man rsync

rsync -nvr -f '+ *.odt' -f '+ **/' -f '- *' --prune-empty-dirs ~/Documents/ ~/copies/

最好使用“dry run”选项-n和详细选项-v,以便在运行真实命令之前(n从命令行中删除时)查看将执行的操作。

相关内容