在不同深度的文件夹中重命名带有前缀和后缀的文件

在不同深度的文件夹中重命名带有前缀和后缀的文件

我有许多不同扩展名(jpeg、jpg、png)的图像,它们包含在许多不同的目录中,其中许多图像可能包含在其他文件夹中以便组织。

例如:

Folder 1/
Folder A/
     Image 01.jpg
     Image 02.png
Folder 2/
     Folder B/
          Folder C/
               Image 03.jpeg
               Image 04.png

层次结构和文件夹会根据我正在处理的内容而变化。我通常需要附加图像父文件夹作为前缀,并为页面添加数字后缀,例如 Page 001、002 等。

我通常使用 Pyrenamer 程序进入每个文件夹并批量命名文件夹中的所有图像,但这需要花费大量时间。例如,50 个文件夹有 50 个作业。

我知道可以编写一个脚本(最好是 nautilus 脚本),我可以在包含多个文件夹的单个文件夹上使用该脚本来完成作业。

例如,“Image 01.jpg”将被重命名为“Folder A - Page 001.jpg”,而“Image 04.png”将被重命名为“Folder C - Page 004.png”。图像的顺序是特定的,需要按照与之前相同的顺序重命名和编号,只需使用适当的前缀和后缀即可。

Pyrenamer 可以完成后缀,但只允许使用当前目录(而不是父目录)重命名,因此所需的前缀毫无用处。

我的终端知识有限,编程知识也有限。任何帮助都将不胜感激,这将大大加快我的工作流程。

答案1

bash脚本应该执行以下操作:要操作的路径必须作为参数传递给它(这是故意的),例如:

./script.sh <directory>
#!/bin/bash

while read filepath
do
    newpath="$(<<< "$filepath" sed 's/^\(.*\)\/\(.*\)\/[^ ]*\(.*\)$/\1\/\2\/Folder \2 - Page 0\3/')"
    mv "$filepath" "$newpath"
done <<< "`find $1 -type f \( -iname '*.png' -o -iname '*.jpeg' -o -iname '*.jpg' \)`"

前:

<目录>
│ │ f1
│ │ ── 图片01.png
│ │ ── 图片02.png
│ └── 图片03.jpeg
│ │ │
│ └── f2.1
│ │ ── 图片04.jpeg
│ │ ── 图片05.jpg
│ └── 图片06.jpg
└── f3
    └── f3.1
        └── f3.1.1
            │ ── 图片07.png
            │ ── 图片08.png
            └── 图片09.jpeg

后:

<目录>
│ │ f1
│ ═── 文件夹f1 - 第001页.png
│ ═── 文件夹f1 - 第002页.png
│ └── 文件夹 f1 - 第 003 页.jpeg
│ │ │
│ └── f2.1
│ ═ ...
│ ═ ...
│ └── 文件夹 f2.1 - 第 006 页.jpg
└── f3
    └── f3.1
        └── f3.1.1
            ── 文件夹 f3.1.1 - 第 007 页.png
            ── 文件夹f3.1.1 - 第008页.png
            └── 文件夹 f3.1.1 - 第 009 页.jpeg

答案2

假设文件夹包含仅有的您要重命名的文件,并且您正在使用 bash:

$ shopt -s globstar
$ rename -n 's;/([^/]*)/([^/]*) (\d+)\.(\w+)$;sprintf("/%s/%s - Page %03d.%s", $1, $1, $3, $4);e' ./Folder*/**/*
./Folder 2/Folder B/Folder C/Image 03.jpeg renamed as ./Folder 2/Folder B/Folder C/Folder C - Page 003.jpeg
./Folder 2/Folder B/Folder C/Image 04.png renamed as ./Folder 2/Folder B/Folder C/Folder C - Page 004.png
./Folder A/Image 01.jpg renamed as ./Folder A/Folder A - Page 001.jpg
./Folder A/Image 02.png renamed as ./Folder A/Folder A - Page 002.png

rename是一个 Perl 脚本,对于重命名文件非常有用。在本例中,我使用了一个正则表达式:

  • /([^/]*)/- 匹配目录组件,以斜线为界。
  • ([^/]*)- 匹配文件名的前缀,后跟一个空格
  • (\d+)- 匹配文件名中的数字
  • \.(\w+)- 匹配扩展名
  • $全部固定在文件名的末尾。

然后我使用sprintf以所需方式打印匹配的值。改变 3 以%03d获得更多填充。

in**./Folder*/**/*一个递归全局,这就是我需要启用的原因globstar

相关内容