bash使用连续编号批量重命名文件夹和子文件夹中的文件
我需要一个bash脚本来执行以下操作: 针对某个文件夹中存在的每个文件以及其子文件夹中的前缀编号(4位数字)然后是分隔符( - )bash使用连续编号批量重命名文件夹和子文件夹中的文件
因此,例如,我有:
/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
备注:
Socowi的回答非常类似地雷。不同之处在于(1)他需要bash 4.0,默认情况下未安装在Mac上。我不。 (2)他的脚本将使用包含换行符的文件名(非常罕见的场合)。我的不会。 (3) 如果所有mp3文件(包括子目录)的名称总长度大于262144字节,他的脚本将失败;如果你有超过6000个文件,我会说这会发生。我的工作将与任何数量的文件。
(注意mapfile
-loving庆典从业者:我知道,使用mapfile
可能生成索引,而不会明确创建$i
一个聪明的办法,但(我)就没有必要了巨大的数组mapfile
会创建及(ii )当解析传递给mv
回调的命令行时,我将需要一个变量。)
以下脚本为当前目录下的所有mp3文件加上四位数字前缀,并且应该适用于绝对可能的每个可能的文件名。
#! /bin/bash
shopt -s globstar nullglob
n=0
for f in **/*.mp3; do
((++n))
b="$(basename "$f")"
mv -i "$f" "${f%"$b"}/$(printf '%04d' "$n")-$b"
done
的globstar **
需要未在Mac上预装据我所知(与bash --version
检查)庆典> 4.0。但我听说有办法安装更新的bash版本。
文件编号的顺序取决于您的区域设置。 Bash根据LC_COLLATE
以有序方式扩展**/*
。至少在LC_COLLATE=en_US.UTF-8
文件按字母顺序编号,我们不必担心名称冲突 - 保证不会发生覆盖的命令。
好的解决方案,避免'find'和后续'sort'。但是,将所有路径名放在一个命令行中可能会导致达到262144字节的BSD“ARG_MAX”限制。估计每个路径名称的平均值为45个字节(在我自己的音乐收藏中测量...),这将发生在大约6000个文件中...... – Dario