在多个子文件夹中依次重命名jpeg文件

时间:2019-02-21 16:02:02

标签: bash macos unix find

如何依次重命名许多子文件夹中的许多jpegs文件?
目前,它们中的许多文件具有相同的文件名(例如frame1.jpeg)。 我只想在文件名中带有“框架”但顺序排列的所有jpg文件中使用6位数字后缀,以便以后我可以将它们移动到一个文件夹中而不会被覆盖。

也许有一种方法可以找到,但是我不知道怎么做……

这是我的文件夹结构:

├── mainfolder
|    ├── subfolder1
|    |   ├── frame1.jpg
|    |   └── frame2.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder2
|    |   ├── frame1.jpg
|    |   └── frame2.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder3
|    |   ├── frame.jpg
|    |   └── frame2.jpg
|    |   └── unimportant.jpg
…


这就是我想象的最后要命名的文件的方式:

├── mainfolder
|    ├── subfolder1
|    |   ├── frame0000001.jpg
|    |   └── frame0000002.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder2
|    |   ├── frame0000003.jpg
|    |   └── frame0000004.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder3
|    |   ├── frame0000005.jpg
|    |   └── frame0000006.jpg
|    |   └── unimportant.jpg
…

2 个答案:

答案 0 :(得分:1)

Shellcheck干净的代码将打印mv命令列表,该命令应符合您的要求:

#! /bin/bash

seqnum=1
find mainfolder -type f -name 'frame*.jpg' -print0 \
    |   while IFS= read -r -d '' jpg_path ; do
            dir=${jpg_path%/*}
            printf -v new_jpg_path '%s/frame%06d.jpg' "$dir" $((seqnum++))
            echo mv -i -- "$jpg_path" "$new_jpg_path"
        done

您很高兴它会做正确的事,在echo之前删除mv ...并运行它以实际执行重命名。 -i的{​​{1}}选项是为了防止覆盖可能已经存在的文件。

答案 1 :(得分:0)

与所有新的陌生命令一样,在对计算机进行备份之后,请在文件的副本上尝试此操作。另外,不要在HOME目录中尝试此操作,因为它会递归到子目录,因此请在下面没有重要意义的目录中尝试!

我想我明白!如果您使用自制软件,则可以使用:

brew install rename

以安装Perl rename命令。

然后您可以运行以下命令:

find . -name "frame*.jpg" -print0 | rename --dry-run --stdin -0 -N "000001" '$_="frame" . $N . ".jpg"'

其中表示... ”查找当前目录及以下目录中以frame...开头的所有JPEG文件,并将其名称传递给以空终止结尾的rename。{{1 }}实用程序然后读取以空值结尾的名称,并启动一个计数器rename,该计数器的总宽度为6位,并将文件名设置为单词$N,后跟序号,每个文件加1。 frame后缀”

如果输出看起来不错,请在没有.jpg的情况下再次运行。