如何在Linux上使用命令行对多个子目录中的多个文件进行零填充?

如何在Linux上使用命令行对多个子目录中的多个文件进行零填充?

我有大约 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

相关内容