我需要一个执行以下操作的 bash 脚本: 对于文件夹及其子文件夹中存在的特定类型的每个文件,它都会在前面添加一个序号(4 位数字),后跟一个分隔符 (-)
例如我有:
/Queen/(1986) A Kind of Magic/01.One vision.mp3
/Queen/(1986) A Kind of Magic/02.A kind of magic.mp3
/Queen/(1986) A Kind of Magic/cover.jpg
/Queen/(1991) Innuendo/01.Innuendo.mp3
/Queen/(1991) Innuendo/02.Headlong.mp3
/Queen/(1991) Innuendo/cover.jpg
/Queen/(1991) Innuendo/booklet.pdf
我希望在脚本的末尾添加以下内容:
/Queen/(1986) A Kind of Magic/0001-01.One vision.mp3
/Queen/(1986) A Kind of Magic/0002-02.A kind of magic.mp3
/Queen/(1986) A Kind of Magic/cover.jpg
/Queen/(1991) Innuendo/0003-01.Innuendo.mp3
/Queen/(1991) Innuendo/0004-02.Headlong.mp3
/Queen/(1991) Innuendo/cover.jpg
/Queen/(1991) Innuendo/booklet.pdf
请注意,我的文件名中有空格,文件夹名称中有括号! 我怎样才能做到这一点?我尝试使用 mac automator 但没有成功! :(
谢谢
最佳答案
创建以下 bash 脚本并在音乐收藏的基本目录中执行它。它适用于包含空格、括号、单引号和双引号以及其他奇怪字符的文件和目录名称,但不适用于包含换行符或真正奇怪字符的名称。您可以自定义它,为 start_dir
指定不同的值,或更改格式规范 %s/%04u-%s
,其中当前包含 %s
(目录名称)%04u
(编号索引,格式为零填充的四位整数)和 %s
(文件名),由/
和 -
。
#!/bin/bash
start_dir="."
find "$start_dir" -name '*.mp3' -type f \
|sort \
|while read name; do
((i++))
mv -i "$name" \
"$(printf '%s/%04u-%s' "$(dirname "$name")" $((i)) "$(basename "$name")")"
done
备注:
索科维的回答与我的非常相似。不同之处在于(1)他需要 bash 4.0,Mac 上默认不安装该版本。我不。 (2) 他的脚本将使用包含换行符的文件名(非常罕见的情况)。我的不会。 (3) 如果你的所有mp3文件(包括子目录)的名称总长度超过262144字节,他的脚本将会失败;我想说,如果您的文件超过大约 6000 个,就会发生这种情况。我的可以处理任意数量的文件。
(热爱 mapfile
的 bash 从业者请注意:我知道使用 mapfile
可能是生成索引的明智方法,而无需显式创建 $i
,但是 (i) 不需要创建巨大的数组 mapfile
,并且 (ii) 在解析传递给 mv
的命令行时我仍然需要一个变量> 回调。)
关于bash 使用序列号批量重命名文件夹和子文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42607819/