我已经搜索了很多话题,围绕着我想要完成的事情起舞。我有2000多个m4a文件和17000 MP3。目录结构是/home/me/Music/MP3/Artist/Album/song.m4a。我想使用“find”来发现m4a歌曲,移动它们,它们的唱片目录,以及他们的艺术家目录到/home/me/Music/M4A/artist/Album/song.M4A。我使用mv-exec开关失败,并且使用basename和/或dirname创建脚本失败。父目录和父目录已经抛出。移动文件本身并不是问题,只是创建目录结构并移动文件。经过零碎的努力,我导出了文件列表(部分原因是我想查看文件位置和歌曲)。然后我运行find /home/me/Music/MP3 -name "*.m4a" >> dir.sh将MP3替换为M4A。从dir.sh中删除这个示例中的song.M4A将为我留下一个艺术家/专辑目录列表,以便在mkdir的while循环中运行/home/me/Music/M4A/Metallica/Re-load/Metallica-the Unforgiven.M4A。不幸的是,这就是我被卡住的地方,dirname会产生一个“.”

最佳答案

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

应该做这项工作,但在你打电话给它之前,先检查一下“moveit_baby.sh”。
根据sed的实现,您需要在第二个sed中使用\(\)或纯()。当然,字符串"MP3"不应该是艺术家、唱片集或歌曲名的一部分,否则您需要一个更复杂的过滤器,请参见下文。
只有在目录名更改时,才能在插入mkdir -p时进一步优化。使用while read循环可以更好地实现对输入参数的更复杂的决策
find /home/me/Music/MP3 -name \*.m4a | while read file
do
    # do anything you want to $file here
done

10-08 05:18