bash 使用序列号批量重命名文件夹和子文件夹中的文件

标签 bash rename sequential

我需要一个执行以下操作的 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/

相关文章:

rxjs - 顺序执行可观察项并发出一个结果

bash - 用于格式化文件名中数字的 Shell 命令

powershell - "Media created"的变量? (电源外壳)

linux - 用于复制 (scp) 和重命名的 Shell 脚本

r - 根据存储在 data.frame 中的单独字符向量,有条件地重命名列表中的列

python - kerasequential().predict(x_test) 只返回两个类的 1 列

bash - 从文件 B 中删除文件 A 中的所有匹配项

linux - Bash ~ 从目录的子目录中的脚本访问可能更改的目录

linux - 如何在 bash 中确定/mountpoint 是否是从其他操作系统挂载的?

Python 3.3 需要有关非常简单的初学者代码的帮助