“镜像”在 FLAC 的语境下通常有两种理解:

- 精确备份:创建一个与原始音频 CD 完全相同的 1:1 副本,包括所有轨道、元数据和 CD-TEXT(如果有的话),这个副本是一个包含
.cue和.flac文件(或一个大的.flac文件)的文件夹。 - 批量转换:将一个包含多个音频文件的文件夹(如 MP3、WAV)中的所有文件,全部转换为 FLAC 格式,并保持原有的文件夹结构。
下面我将针对这两种情况,提供最常用和最强大的命令行工具。
核心工具
flac:FLAC 官方的命令行编码器/解码器,用于编码和解码 FLAC 文件。shntool:一个强大的命令行工具,用于处理无损音频文件,特别是分割和合并,它经常与flac配合使用。sox:“Swiss Army knife of audio”,功能极其强大的音频处理工具,也支持 FLAC。ffmpeg:多媒体处理领域的“瑞士军刀”,功能极其全面,可以处理几乎所有格式的音视频,当然也包括 FLAC。
从 CD 创建精确的 FLAC 镜像备份
这是最常见的需求,目标是制作一个可以完美还原为原始 CD 的备份。
使用 shntool 和 flac (推荐,功能最全)
这个方法可以完美处理 CD 的轨道间隙、元数据,并生成一个标准的镜像文件夹。
步骤 1:抓取 CD 音轨

你需要将 CD 音轨抓取为 WAV 文件。cdparanoia 是 Linux 和 macOS 下的经典工具。
# 抓取所有音轨到当前目录,文件名为 track01.wav, track02.wav ... cdparanoia -B # 或者指定一个艺术家和专辑名 cdparanoia -B "Artist Name - Album Name"
执行后,你会得到一堆 .wav 文件和一个 .toc (Table of Contents) 文件。
步骤 2:使用 shntool 和 flac 进行编码
shntool 可以读取 .toc 文件来处理轨道间隙,然后调用 flac 进行编码。

# 创建一个输出目录 mkdir flac_backup # 使用 shntool 的 'cue' 功能,它会自动处理轨道和元数据 # -a flac: 指定使用 flac 编码器 # -o "output=%d/%f.flac": 定义输出格式,%d是轨道号,%f是文件名 # -f: 强制覆盖已存在的文件 # *.toc: 处理所有 .toc 文件 shntool cue -a flac -o "output=flac_backup/%d %t.flac" -f *.toc
命令解释:
cue:shntool的一个模式,用于根据 CUE 文件或 TOC 文件处理音轨。-a flac: 指定使用flac作为后端编码器。-o "output=flac_backup/%d %t.flac": 这是关键,定义了输出文件的命名规则。output=...: 指定输出模板。flac_backup/: 输出到flac_backup这个子文件夹。%d: 轨道号 (e.g., 01, 02)。%t: 轨道标题。.flac: 文件扩展名。
-f: 如果目标文件已存在,则强制覆盖。*.toc: 指定要处理的输入文件。
执行后,flac_backup 文件夹里就会包含所有按轨道号和标题命名的 .flac 文件,并且嵌套了完整的元数据。
使用 ffmpeg (更现代,更简单)
ffmpeg 也可以直接从 CD 设备抓取并编码,非常方便。
步骤 1:找到你的 CD-ROM 设备名
通常是 /dev/cdrom 或 /dev/sr0。
ls /dev/sr*
步骤 2:使用 ffmpeg 抓取并编码
# 创建输出目录 mkdir flac_backup # 执行抓取和编码 ffmpeg -i /dev/sr0 -map 0:a:0 -c:a flac -compression_level 5 "flac_backup/track_%02d.flac"
命令解释:
-i /dev/sr0: 输入源是 CD-ROM 设备。-map 0:a:0: 映射第一个(通常是唯一的)音频流,这可以避免抓取到数据轨道等。-c:a flac: 指定音频编解码器为flac。-compression_level 5: 设置压缩级别(0-8),5 是一个很好的平衡点,压缩率和速度都适中。"flac_backup/track_%02d.flac": 输出文件名模板,%02d表示两位数的轨道号,如track_01.flac。
这个方法会生成独立的 FLAC 文件,但通常不如 shntool 方法生成的文件包含那么丰富的元数据(如 CUE 文件信息),如果你需要一个包含所有信息的单文件镜像,可以看下面的进阶用法。
批量转换文件夹中的音频文件为 FLAC
假设你有一个文件夹,里面有很多 MP3 或 WAV 文件,你想把它们全部转成 FLAC,并保持文件夹结构。
使用 ffmpeg (最推荐)
ffmpeg 的批处理能力非常强大。
命令:
# 遍历当前目录及其子目录下的所有 .wav 文件,并转换为 .flac
find . -type f -name "*.wav" -exec ffmpeg -i {} -c:a flac -compression_level 5 {}.flac \;
# 遍历所有 .mp3 文件
find . -type f -name "*.mp3" -exec ffmpeg -i {} -c:a flac -compression_level 5 {}.flac \;
更优雅的写法(保留原文件名,只改扩展名):
# 创建一个脚本来执行,convert.sh
#!/bin/bash
for file in "$@"; do
# 检查文件是否存在且是常规文件
if [ -f "$file" ]; then
# 获取不带扩展名的文件名
filename="${file%.*}"
# 执行转换
ffmpeg -i "$file" -c:a flac -compression_level 5 "${filename}.flac"
fi
done
# 赋予执行权限
chmod +x convert.sh
# 使用方法:将脚本放在目标文件夹的父目录,然后把要转换的文件夹作为参数传入
# ./convert.sh path/to/your/music_folder
使用 sox (简单直接)
sox 语法更简洁,适合简单的批量转换。
命令:
# 遍历当前目录下所有 .wav 文件并转换为 .flac
for f in *.wav; do
sox "$f" "${f%.wav}.flac"
done
# 遍历所有 .mp3 文件
for f in *.mp3; do
sox "$f" "${f%.mp3}.flac"
done
sox 命令解释:
sox input_file output_file:sox的基本语法。"${f%.wav}.flac": 这是 Bash 的参数扩展。%.wav: 从变量$f的结尾移除.wav字符串。.flac: 然后加上.flac后缀。song.wav会变成song.flac。
总结与推荐
| 场景 | 推荐工具 | 优点 | 缺点 |
|---|---|---|---|
| CD 精确备份 | shntool + flac |
功能最全,完美处理轨道、元数据、CD-TEXT,是发烧友和备份的首选。 | 需要两步操作(抓取+编码),稍微复杂。 |
| CD 精确备份 | ffmpeg |
一步到位,现代且功能强大,集成度高。 | 生成的 FLAC 文件元数据可能不如 shntool 方案完整。 |
| 批量转换 | ffmpeg |
最灵活,支持几乎所有格式,可精细控制参数,适合复杂批处理。 | 语法相对复杂。 |
| 批量转换 | sox |
语法最简单,速度快,适合简单的、同格式文件间的批量转换。 | 功能相对 ffmpeg 较少,对元数据的处理可能不如 ffmpeg 精细。 |
- 想做完美的 CD 备份,用
shntool。 - 想做快速的 CD 抓取或复杂的批量转换,用
ffmpeg。 - 想做最简单的批量转换,用
sox。
