需要帮助编写脚本以将我的.flac文件分成单独的文件夹库

时间:2013-03-31 17:55:12

标签: bash file-io flac

所以我有一个完全混合在一起的不同文件格式的音乐文件夹。它结构合理:音乐/ [艺术家姓名] / [专辑名称],在名为“各种”的文件夹中包含编辑专辑。有些文件夹只包含.mp3,.m4a或.flac文件,有些文件夹有不同文件格式的多个版本的相册。当然还有各种各样的.jpegs封面艺术,很多艺术家文件夹都包含了艺术家肖像的.jpeg,还有很多杂项.cue和.log文件以及其他垃圾。

我想要最终得到的是.flac文件的单独音乐文件夹,保留现有的文件夹结构,将其从现有库中删除。我不想在我当前的库中结束空文件夹,其中专辑只是在flac中。对于具有多种格式的专辑文件夹,我想将封面与封面艺术一起移动到新的库中,但当然也要保留现有的封面艺术。

我无法找到能够处理这个问题的应用程序,但我认为shell脚本可能会处理它。但是我对bash很可怜,真的不想破坏我的库。

这些文件位于我可以使用mac,windows或linux访问的远程磁盘上,所以任何方法都很好。

完全澄清一下,这是我希望编写的逻辑:

  1. 找到包含.flac文件的/ Music的每个子目录

  2. 将这些目录中的每个目录(和中间父目录)复制到/ FLAC中的新位置,但从副本中排除其他音频文件类型(.mp3,.m4a等)。

  3. 如果目录中没有其他音频文件类型而不是.flac,请删除整个目录。如果它有其他音频文件,只需删除.flac文件。

  4. 最后一次扫描所有/ Music以删除任何本身或任何子目录中不包含音频文件的目录。

2 个答案:

答案 0 :(得分:1)

这是另一种方法:

find . -type f -name \*.flac -printf "%h\n" | 
sort -u | 
while read -r dirname; do
    new="../flac/$dirname"
    echo mkdir -p "$new"
    echo mv "$dirname"/*.flac "$new"
    jpgs=("$dirname"/*.jpg)
    [[ ${#jpgs[@]} -gt 0 ]] && echo cp "$dirname"/*.jpg "$new"
done
    带有find
  • -printf将打印出每个flac文件的目录名(相对于当前目录
  • sort -u删除重复项 - 现在您有一个包含flac文件的目录列表
  • while循环遍历目录,克隆另一个目录下的目录层次结构(修改以满足您的需要),移动flac文件,并复制jpg文件(如果有的话)。

如果您满意,请删除echo命令。

答案 1 :(得分:0)

首先制作一个新的父文件夹,例如“MusicNew”应该相当于现有的“Music”文件夹。然后假设您要复制的子文件夹和文件类型的描述,以下代码行应该工作。

IFS='\n'
for i in `find Music -mindepth 2 -maxdepth 3 -type f -name "*flac"`;
do
    echo ${i};
    newfold=`echo ${i} | sed -e 's/Music/MusicNew/g'`;
    filename=`basename ${i}`;
    fulldirpath="${newfold:0:${#newfold} - ${#filename}}";
    echo $fulldirpath/${filename};
    mkdir -p ${fulldirpath};
    mv ${i} ${fulldirpath}/;
done