我有负载(大约 6000 个!)mp3,我想根据文件名将其转储到子目录中。目前它们都在一个子目录中。(一些艺术家已经有一些现有的目录,我不想接触这些文件,但是重复覆盖现有文件是可以的)。
我能看到的最简单的方法是根据文件名创建一个子目录,因为这些文件都被命名为 artist.artist.album.track.mp3。
经过一番搜索,我想出了:
for x in ./*.mp3; do awk x="${x}" -F. '{split(x,a,"."); mkdir a[1]; mv x a[1]/}'; done
但是它告诉我存在语法错误和未终止的正则表达式:
awk: cmd. line:1: x=./Dizzee.Rascal.Radio.1.Live.Lounge.03.That.s.Not.My.Name.mp3
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: x=./Dizzee.Rascal.Radio.1.Live.Lounge.03.That.s.Not.My.Name.mp3
awk: cmd. line:1: ^ unterminated regexp
awk: cmd. line:1: x=./Dizzee.Rascal.Ultimate.Streetdance.CD1.03.Flex.Dave.Spoon.Mix.mp3
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: x=./Dizzee.Rascal.Ultimate.Streetdance.CD1.03.Flex.Dave.Spoon.Mix.mp3
awk: cmd. line:1: ^ unterminated regexp
我认为这是因为文件名没有在语音标记中给出,但我不是 100% 确定?
有人可以帮忙吗?如果您也可以打印出进度,还可以加分。
为什么
awk
?好吧,让我们假设awk
……x="${x}"
在你想成为一个程序需要-v
(即-v x="${x}"
)之前,否则它被解释为一个程序。这就是您收到语法错误的原因。awk
调用执行;所以你需要BEGIN
.a[1]
;也许a[2]
。/
(即在 的上下文中awk
不带引号,而不是外壳)是错误的。mkdir
并且mv
不是awk
. 我认为它们被解释为(空)变量。有system
动作,你可以用。但是由于您需要传递任意文件/目录名称,因此会出现以下问题:我说忘了
awk
这里。下面的代码假定您想要从前两个点分隔段命名的目录。笔记:foo.mp3
将触发错误mkdir -p ./foo.mp3/
;无论如何,我建议创建一个单独的目录来使用:
这使用硬链接,因此速度很快并且几乎不需要额外的磁盘空间。处理里面的目录结构
my_music_copy/
。如果你搞砸了,你总是可以摆脱my_music_copy/
并重新开始。只有在您确定所有内容都在其内部位置之后,才能my_music_copy/
删除my_music/
并重命名my_music_copy/
为my_music/
.如果没有固定数量的段并且需要一些启发式方法,请尝试
vidir
;像这样的东西:然后,您可以使用所选编辑器的“搜索和替换”功能来可靠地创建所需的目录(例如,替换
./Dizzee.Rascal.
为./Dizzee.Rascal/
; 但./Mozart.
与./Mozart/
and或也可能与./W.A.Mozart.
)。请参阅我的这个答案。./W.A.Mozart/
./Mozart/
优点: