递归地将文件从一个目录复制到另一个目录

我将所有音乐都放在文件夹/media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInside 。 我想将所有的/media/kalenpw/HDD/Music复制到/media/kalenpw/HDD/Music所以我用过:

 cp -R /media/kalenpw/MyBook/Music/*.mp3 /media/kalenpw/HDD/Music 

但是这只复制了根音乐文件夹中的mp3并且没有打开任何艺术家子目录并复制这些文件。

我的印象是-R会递归复制所有文件。 我怎样才能实现这个目标?

使用:

 find /media/kalenpw/MyBook/Music/ -name '*.mp3' -exec cp {} /media/kalenpw/HDD/Music \; 

命令不起作用的原因是在运行命令之前扩展了包含通配符( *.mp3 )的名称,因此如果有三个文件( 01.mp3 ,则有效命令为:

 cp -R /media/kalenpw/MyBook/Music/01.mp3 /media/kalenpw/MyBook/Music/02.mp3 /media/kalenpw/MyBook/Music/03.mp3 /media/kalenpw/HDD/Music 

如你所见, -R在这种情况下无效。

您已经明确提到要复制的文件/目录(使用*.mp3即以.mp3结尾的任何文件/目录名称。

因此,任何以/media/kalenpw/MyBook/Music/目录中的.mp3结尾的文件,同样地,将以递归方式复制/media/kalenpw/MyBook/Music/.mp3结尾的任何目录。 如果没有这样匹配的文件/目录,则不会复制任何内容。

现在将所有.mp3文件从/media/kalenpw/MyBook/Music/ recursivley复制到目录/media/kalenpw/HDD/Music/

  • 使用bash

     shopt -s globstar cp -at /media/kalenpw/HDD/Music /media/kalenpw/MyBook/Music/**/*.mp3 
  • 使用find

     find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} + 

你也可以使用cpr :

 $ cd /media/kalenpw/HDD/Music $ cpr -p '/\.mp3$/' '/media/kalenpw/MyBook/Music/' 

请注意,没有-p cpr将保留复制的文件名上的完整目录路径。
可以使用-r (而不是-p )来保留’/media…/Music/’下的路径。
此外, cpr将注意不会覆盖任何文件,将从’0001’开始的数字附加到复制的任何重复文件名。