Bash 在多个子文件夹中按顺序重命名jpeg文件

Bash 在多个子文件夹中按顺序重命名jpeg文件,bash,macos,unix,find,Bash,Macos,Unix,Find,如何按顺序重命名多个子文件夹中的多个JPEG文件 目前,它们中的许多具有相同的文件名(例如frame1.jpeg)。 我只想在所有文件名中有“frame”的jpg文件上有一个6位数的数字后缀,但要按顺序,以便以后我可以将它们移动到一个文件夹中,而不会有被覆盖的危险 也许有一种方法可以用查找来完成,但我不知道如何 这是我的文件夹结构: ├── mainfolder | ├── subfolder1 | | ├── frame1.jpg | | └── frame2.jpg

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

也许有一种方法可以用查找来完成,但我不知道如何

这是我的文件夹结构:

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

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

此-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
选项用于防止覆盖可能已经存在的文件。

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

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

brew install rename
安装Perl
rename
命令

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

find . -name "frame*.jpg" -print0 | rename --dry-run --stdin -0 -N "000001" '$_="frame" . $N . ".jpg"'
上面说。。。“查找当前目录及以下目录中所有以
frame…
开头的JPEG文件,并将其名称以null结尾传递给
rename
rename
实用程序然后读取以null结尾的名称,并启动一个总宽为6位的计数器
$N
,并将文件名设置为单词
frame
。”>后跟序列号,每个文件递增1,并附加
.jpg
后缀”


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

非常感谢您的回答和解释!我不得不在代码末尾的“jpg”前面添加一个“.”,因为文件名为frame1jpg而不是frame1.jpg,但除此之外,它工作得非常好!做得好!谢谢你让我知道这个小错误。我已经更新了我的答案来纠正这一点,祝你的项目好运!
find . -name "frame*.jpg" -print0 | rename --dry-run --stdin -0 -N "000001" '$_="frame" . $N . ".jpg"'