递归地将文件从一个目录复制到另一个目录
我将所有音乐都放在文件夹/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’开始的数字附加到复制的任何重复文件名。