Answers:
用:
find /media/kalenpw/MyBook/Music/ -name '*.mp3' -exec cp {} /media/kalenpw/HDD/Music \;
之所以你的命令不工作是包含通配符(名称*.mp3)的命令之前展开运行,所以如果你有三个文件(01.mp3, 02.mp3,03.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。
所以在结尾的文件.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 {} +
假设你有一堆的.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并将文件复制到该新位置。
-iname不要-name以任何文件结尾的情况.MP3。