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


11

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

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

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

我的印象是-R会递归复制所有文件。我如何实现上述目标?

Answers:


19

用:

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

之所以你的命令不工作是包含通配符(名称*.mp3)的命令之前展开运行,所以如果你有三个文件(01.mp302.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在这种情况下无效。


我建议-iname不要-name以任何文件结尾的情况.MP3
奥拉西

谢谢你的工作。或至少正在工作中。
kalenpw

5

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

所以在结尾的文件.mp3/media/kalenpw/MyBook/Music/目录中,同样,任何在结束目录.mp3/media/kalenpw/MyBook/Music/会被复制,递归。如果没有这样的匹配文件/目录,则不会复制任何内容。

现在将所有.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 {} +
    

谢谢,techraf首先回答了,所以我接受了他们的回答。
kalenpw

1

您也可以使用cpr

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

请注意,如果没有-p cpr,将在复制的文件名上保留完整的目录路径。
-r可以(而不是-p)用于保留“ /media.../Music/”下的路径。
还应cpr注意不要覆盖任何文件,在复制的任何重复文件名后都添加一个以“ 0001”开头的数字。


1

假设你有一堆的.docx.mp3.txt.xlsx存储在这个目录结构的文件:

/files/
/files/dir1/
/files/dir1/dir11/
/files/dir1/dir12/
/files/dir1/dir13/
/files/dir2/
/files/dir3/
/files/dir3/dir31/
/files/dir3/dir32/
/files/dir4/
/files/dir5/
/files/dir51/
/files/dir52/
/files/dir53/
/files/dir54/

......你想递归到所有这样的目录,以便复制所有发现.mp3的文件/home/me/music/,但你并不想在目标保持这样的目录树(例如,你希望找到的所有.mp3文件复制到/home/me/music/而不是复制到相应目录例如/home/me/music/dir1//home/me/music/dir1/dir11/等等)。

在这种情况下,首先在shell终端(bash)运行以下命令,以访问文件搜索的根目录:

cd /files

...然后运行以下命令:

for i in `find . -iname '*.mp3'`; do cp $i /home/me/music/; done

如果您确实希望将源目录树保留在目标中,请改为运行以下命令(运行之后cd /files):

find . -iname '*.mp3' | cpio -pdm /home/me/music/

在上述的命令时,搜索是不区分大小写(即匹配.mp3.MP3.mP3.Mp3)。使用-name替代-iname,如果你想搜索(例如,使用是区分大小写-name.mp3字符的字符串会与结尾的文件.mp3,但不是那些与结尾.MP3.mP3也没有.Mp3)。


对于保留目录结构的情况,请从源目录运行此命令。如果运行find /source/dir -iname '*.mp3' | cpio -pdm /home/me/music/,它将创建/ home / me / music / source / dir并将文件复制到该新位置。
Gautam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.