我正在尝试复制所有.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 -r
steeldriver 所建议的)但只用文件填充.odt
,您可以使用 来执行此操作rsync
,其中-f
是“过滤器”选项。其他选项更直接。您可以在 中找到所有选项man rsync
。
rsync -nvr -f '+ *.odt' -f '+ **/' -f '- *' --prune-empty-dirs ~/Documents/ ~/copies/
最好使用“dry run”选项-n
和详细选项-v
,以便在运行真实命令之前(n
从命令行中删除时)查看将执行的操作。