我已经搜索过了很多主题围绕着我想要完成的事情。我有超过2000个m4a文件埋藏在17,000个mp3中。目录结构是 / home / me / Music / MP3 /Artist/Album/song.m4a 。我想使用' find'发现m4a歌曲,将它们,他们的专辑目录和他们的艺术家目录移动到 / home / me / Music / M4A / Artist / Album /song.m4a 。我没有成功使用mv -exec开关,并且我使用basename和/或dirname创建脚本失败了。我抛出了父目录和祖父目录。移动文件本身不是问题,只需创建目录结构 AND 移动文件。在零碎的努力中,我导出了文件列表find /home/me/Music/MP3 -name "*.m4a" >> dir.sh
(部分是因为我想查看文件位置和歌曲数量)。然后我跑sed 's/MP3/M4A/g' dir.sh
用M4A替换MP3。从dir.sh中删除此示例中的 song.m4a 将为我提供一个 Artist / Album 目录列表,以通过mkdir运行while循环: / home / me / Music / M4A / Metallica / Re-load / Metallica - The Unforgiven.m4a 。不幸的是,这就是我被困住的地方,dirname产生了一个&#39; <#39;
答案 0 :(得分:1)
find /home/me/Music/MP3 -name \*.m4a| sed -e 's/.*/mkdir -p $(dirname "&"); mv "&" "&"M4A;/' | sed -e 's/MP3\([^"]*\)"M4A$/M4A\1"/' > moveit_baby.sh
bash moveit_baby.sh
应该完成这项工作,但请检查&#34; moveit_baby.sh&#34;在你打电话之前。
根据您的sed实施,您需要在第二个sed中使用\(\)
或普通()
。 当然,字符串"MP3"
既不应该是艺术家,专辑或歌曲名称的一部分,否则你需要一个更复杂的过滤器,见下文。
仅当dirname更改时,才可以在插入mkdir -p
时进一步优化。使用while read
循环
find /home/me/Music/MP3 -name \*.m4a | while read file
do
# do anything you want to $file here
done