我有加载(大约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/
;for x in ./*.mp3; do
# remove leading ./
d="${x#./}"
# first segment
d1="${d%%.*}"
# remainder
d="${d#*.}"
# second segment
d2="${d%%.*}"
#result
d="./${d1}.${d2}/"
mkdir -p "$d" && mv "$x" "$d"
done
无论如何,我建议创建一个单独的目录来使用:
cp -al my_music/ my_music_copy/
cd my_music_copy/
这使用硬链接,因此速度很快,几乎不需要额外的磁盘空间。处理内部的目录结构my_music_copy/
。如果您搞砸了,总是可以摆脱my_music_copy/
并重新开始。只有在确定所有内容都在里面后my_music_copy/
,才将其删除my_music/
并重命名my_music_copy/
为my_music/
。
如果没有固定数量的段,并且需要一些启发式方法,请尝试vidir
; 像这样的东西:
find . -maxdepth 1 -type f -iname '*.mp3' | EDITOR=vi vidir -
然后,你可以使用“查找和替换”功能所选择的编辑器来可靠地创建所需的目录(如更换./Dizzee.Rascal.
用./Dizzee.Rascal/
;但./Mozart.
与./Mozart/
和./W.A.Mozart.
与./W.A.Mozart/
或可能与./Mozart/
为好)。看到我的这个答案。
好处:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句