用于移动文件及其父目录的Bash脚本

时间:2016-03-28 23:19:21

标签: linux bash shell

我已经搜索过了很多主题围绕着我想要完成的事情。我有超过2000个m4a文件埋藏在17,000个mp3中。目录结构是 / home / me / Music / MP3 /Artist/Album/song.m4a 。我想使用&#39; find&#39;发现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;

1 个答案:

答案 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