我有大约 200 个文件夹,每个文件夹内有 1000 个或更多 jpeg,所有这些文件夹都需要零填充到 4 位数字。其中一些文件夹还有包含更深图像的子目录。这些照片的名称都不同(即在一个文件夹中,它们可能被称为 Image_1.jpg、Image_11.jpg 等,而另一张照片可能包含名为 Photo01.jpg、Photo02.jpg 的文件)
.
├── folderA
│ ├── subfolder1
│ │ ├── Photo_1.jpg
│ │ └── Photo_11.jpg
│ └── subfolder2
│ ├── image001.jpg
│ ├── image002.jpg
│ └── image003.jpg
└── folderB
├── subfolder1
│ ├── foto_01.jpg
│ └── foto_01.jpg
└── subfolder2
├── foto_01.jpg
├── foto_02.jpg
└── foto_03.jpg
谁能告诉我如何运行一个命令,该命令将进入所有子文件夹并将文件名中的数字零填充为 4 个字符?
答案1
使用perl
rename
:
rename -n --filename 's/\d+/sprintf("%04d",$&)/e' *.jpg
或递归:
find . -type f -name "*.jpg" -exec rename -n --filename 's/\d+/sprintf("%04d",$&)/e' {} +
- 该
--filename
标志确保仅重命名文件名,而不是路径,否则您最终会得到subfolder0001
等。 -n
如果您对输出满意,请删除。
答案2
对于不使用的解决方案Perl模块rename
适用于此用例:
files=$(find . -name '*.jpg' -type f)
newfiles=$(echo "$files" \
| sed -E 's|(.*/.*[^[:digit:]]+)([[:digit:]]+)(\.jpg)|\1\t\2\t\3|' \
| awk -F '\t' '{print $1 sprintf("%04d",$2) $3}')
while read f1; read -u 3 f2; do
echo mv "$f1" "$f2"
done <<< "$files" 3<<< "$newfiles"
解释
该files
变量存储找到的所有 jpg。find
如果需要,您可以使用“-regex” 。
该newfiles
变量存储新的 jpg 文件名。该代码将路径名分成三部分,中间部分是 jpg 文件名末尾的数字,然后用零填充到宽度 4。
该while
循环读取两个变量,并使用在这两个变量中找到的文件名列表执行任何命令。在这种情况下,它会将mv
命令回显到屏幕上。删除echo
以执行实际移动。
read -d
通过在文件名之间添加空字符并使用 、添加read -r
等读取这些字符,可以改进此代码以处理包含换行符、制表符或反斜杠的路径。
您可以在将来的使用场景中使用和修改它,用于重命名以外的其他操作。
输出
以下是示例目录树的输出:
mv ./folderB/subfolder2/foto_01.jpg ./folderB/subfolder2/foto_0001.jpg
mv ./folderB/subfolder2/foto_02.jpg ./folderB/subfolder2/foto_0002.jpg
mv ./folderB/subfolder2/foto_03.jpg ./folderB/subfolder2/foto_0003.jpg
mv ./folderB/subfolder1/foto_01.jpg ./folderB/subfolder1/foto_0001.jpg
mv ./folderB/subfolder1/foto_02.jpg ./folderB/subfolder1/foto_0002.jpg
mv ./folderA/subfolder2/image002.jpg ./folderA/subfolder2/image0002.jpg
mv ./folderA/subfolder2/image003.jpg ./folderA/subfolder2/image0003.jpg
mv ./folderA/subfolder2/image001.jpg ./folderA/subfolder2/image0001.jpg
mv ./folderA/subfolder1/Photo_1.jpg ./folderA/subfolder1/Photo_0001.jpg
mv ./folderA/subfolder1/Photo_11.jpg ./folderA/subfolder1/Photo_0011.jpg