如何依次重命名许多子文件夹中的许多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
…
答案 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
的情况下再次运行。