【问题标题】:Rename jpeg files sequentially in multiple subfolders在多个子文件夹中按顺序重命名 jpeg 文件
【发布时间】:2019-07-15 14:50:21
【问题描述】:

如何按顺序重命名大量子文件夹中的大量 jpegs 文件?
目前,它们中的许多具有相同的文件名(例如 frame1.jpeg)。 我只想在文件名中包含“frame”但按顺序排列的所有 jpg 文件上添加 6 位数字后缀,以便稍后我可以将它们移动到一个文件夹中,而不会有被覆盖的危险。

find 可能有办法做到这一点,但我不知道如何......

这是我的文件夹结构:

├── 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
…

【问题讨论】:

    标签: bash macos unix find


    【解决方案1】:

    这个Shellcheck-clean 代码将打印一个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
    

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

    【讨论】:

      【解决方案2】:

      与所有新的、不熟悉的命令一样,请在备份计算机后在文件的副本上尝试此操作。另外,不要在 HOME 目录中尝试,因为它会递归到子目录中,因此请在没有任何重要内容的目录中尝试!

      我想我明白了!如果你使用 homebrew,你可以使用:

      brew install rename
      

      安装 Perl rename 命令。

      然后你可以运行这个:

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

      它说... “在当前目录及以下目录中查找所有以 frame... 开头的 JPEG 文件,并将它们的名称传递给 rename 并以空终止。rename 实用程序然后读取以 null 结尾的名称并启动一个计数器 $N,总宽度为 6 位,并将文件名设置为单词 frame 后跟序列号,每个文件递增 1 并附加 .jpg 后缀" .

      如果输出看起来不错,请在不使用 --dry-run 的情况下再次运行。

      【讨论】:

      • 非常感谢您的回答和解释!我必须添加一个“。”在代码末尾的“jpg”前面,因为文件被称为 frame1jpg 而不是 frame1.jpg,但除此之外它工作得很好!
      • 干得好!谢谢你让我知道这个小错误。我已经更新了我的答案以纠正这个问题,祝你的项目好运!
      猜你喜欢
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 2017-11-13
      • 2016-06-28
      • 2011-11-09
      • 2020-10-20
      • 2015-01-24
      相关资源
      最近更新 更多