首先我要声明,我是一名 Linux 新手。我正在寻找一种方法来复制具有相同名称但具有不同文件扩展名的文件。
背景信息:
我收藏了大量音乐。绝大多数都是 .flac 格式。为了在车上播放我的收藏,我将它们全部转码为不同的文件格式。我有一个源 .flac 文件库,然后是完全相同的 .mp3 和 .m4a (AAC) 转码库,因为我们的汽车支持各种文件格式。我的车上有一个闪存驱动器,支持 AAC 和 MP3 播放,但不支持 flac。闪存驱动器上的音乐是我从电脑上的大型库中选择的。我不需要很多完整的专辑,因此我的闪存驱动器上只有我从大型库中精心挑选的文件。
现在,我们卖掉了旧车,买了一辆新车,这辆车支持 FLAC 播放。我想知道,是否可以通过终端将 Flashdrive1 中的内容与 COMPUTER1 主库进行匹配,然后将相应的匹配文件名与所需的文件类型和适当的文件夹结构复制到 FLASHDRIVE2,而不是手动将新闪存驱动器上的 flac 曲目与旧闪存驱动器上的 mp3 曲目进行匹配
总结
取自:
FLASHDRIVE1
\Artist
\Album
\01 tracktitle.mp3
02 tracktitle.mp3
查找具有相同文件结构和命名方案的相应 .flac 版本,只有不同的文件格式:
COMPUTER1
\Artist
\Album
\01 tracktitle.flac
| 02 tracktitle.flac
| 03 tracktitle.flac
复制到:
FLASHDRIVE2
\Artist
\Album
\01 tracktitle.flac
| 02 tracktitle.flac
*在此假设中,轨道 03 被省略,因为它不存在于 Flashdrive1 上,因此不希望它存在于 Flashdrive2 上
我知道我必须调用 find 并设置文件类型,并且 grep 也会参与其中,但我不知道该如何用正确的语法。我在 Google 上搜索过类似的问题,但找不到任何可以实现我想要实现的。如果我没有仔细搜索,请随时批评我。不过,如果能得到帮助,我将不胜感激。
答案1
grep
你也可以使用sed
:
find /path/to/flashdrive -iname '*.mp3' -printf '%P\0' |
sed -z 's/\.mp3$/.flac/' |
rsync -aP --files-from=- -0 /path/to/computer1 /path/to/flashdrive --dry-run
为了:
find
查找 MP3 文件并打印它们的相对路径,以 ASCII NUL 字符 (\0
)分隔sed
用 替换.mp3
和 结尾.flac
,用来-z
处理 NUL 分隔的酸橙。rsync
复制文件同时保留目录结构和权限(-a
),从 stdin 读取要复制的文件路径(--files-from=-
),使用 NUL 分隔的行(-0
)。
用于--dry-run
模拟复制,观察输出,如果看起来正常,则再次运行而不使用该选项。