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

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

我把所有音乐都放在一个文件夹中/media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInside。我想把所有 mp3 复制到其中,/media/kalenpw/HDD/Music所以我使用了:

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

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

我以为-R会递归复制所有文件。我该如何实现该目标?

答案1

使用:

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

您的命令不起作用的原因是包含通配符(*.mp3)的名称在运行命令之前会被扩展,因此如果您有三个文件(01.mp3,, ) 02.mp303.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在这种情况下没有效果。

答案2

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

.mp3因此,任何以in结尾的文件以及以in/media/kalenpw/MyBook/Music/结尾的目录都将被递归复制。如果没有匹配的文件/目录,则不会复制任何内容。.mp3/media/kalenpw/MyBook/Music/

现在将所有.mp3文件从/media/kalenpw/MyBook/Music/递归复制到目录/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 {} +
    

答案3

最简单的方法是使用没有通配符且只有目录名称的复制命令:

cd /media/kalenpw/HDD
cp -r /media/kalenpw/MyBook/Music .

如果当前目录中还没有名为 Music 的目录,则此操作将在当前目录中创建一个新的 Music 目录。如果您已经有一个名为 Music 的目录,则此操作会将其内容复制到现有的 Music 目录中。当然,此操作将获取所有文件,而不仅仅是 .mp3 文件,因此可能无法为您提供所需的灵活性。

答案4

您还可以使用心肺复苏

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

请注意,没有-p 心肺复苏将保留复制文件名的完整目录路径。
-r可用于(代替-p)保留“/media.../Music/”下的路径。
还将cpr确保不会覆盖任何文件,并在复制的任何重复文件名后附加一个从“0001”开始的数字。

相关内容