-1

所以我有一个充满不同文件格式的音乐文件夹,它们混合在一起。它结构良好:音乐/[艺术家姓名]/[专辑名称],合辑位于名为“Various”的文件夹中。有些文件夹仅包含 .mp3、.m4a 或 .flac 文件,有些文件夹包含不同文件格式的专辑的多个版本。当然还有各种 .jpeg 的封面艺术,许多艺术家文件夹包含艺术家肖像的 .jpeg,还有许多杂项 .cue 和 .log 文件和其他垃圾。

我想要结束的是 .flac 文件的单独音乐文件夹,保留现有文件夹结构,将它们从现有库中删除。我也不想在我当前的库中得到空文件夹,因为专辑只是在 flac 中。在具有多种格式的专辑文件夹的情况下,我想将flacs与封面一起移动到新库中,但当然也要保留现有的封面。

我还没有找到能够处理这个问题的应用程序,但我认为一个 shell 脚本可能可以处理它。但是我对 bash 很可怜,真的不想破坏我的图书馆。

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

为了完全澄清,这是我希望编码的逻辑:

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

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

  3. 如果该目录除了 .flac 之外没有其他音频文件类型,请删除整个目录。如果它确实有其他音频文件,只需删除 .flac 文件。

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

4

2 回答 2

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
  • findwith-printf会打印出每个flac文件的目录名(相对于当前目录
  • sort -u删除重复项——现在你有一个包含 flac 文件的目录列表
  • while 循环遍历目录,在另一个目录下克隆目录层次结构(根据您的需要进行修改),移动 flac 文件,并复制 jpg 文件(如果有)。

echo如果您满意它对您有用,请删除这些命令。

于 2013-03-31T23:29:04.837 回答
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
于 2013-03-31T20:04:13.560 回答