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
。