我有一个父目录,里面有许多目录。在这些目录中,我又有多个子目录,它们包含许多图像:
Parent
|
├──dirA
| ├──sub_A1
| | ├──00000001.jpg
| | ├──00000002.jpg
| | ├──00000003.jpg
| |
| ├──sub_A2
| ├──00000001.jpg
| ├──00000002.jpg
| ├──00000003.jpg
|
├──dirB
├──sub_B1
| ├──00000001.jpg
| ├──00000002.jpg
| ├──00000003.jpg
|
├──sub_B2
├──00000001.jpg
├──00000002.jpg
├──00000003.jpg
我想以增量的方式重命名所有图像,即 1.jpg、2.jpg、3.jpg 等。但是,我不希望重置子目录的计数器。
因此输出将是这样的:
Parent
|
├──dirA
| ├──sub_A1
| | ├──1.jpg
| | ├──2.jpg
| | ├──3.jpg
| |
| ├──sub_A2
| ├──4.jpg
| ├──5.jpg
| ├──6.jpg
|
├──dirB
├──sub_B1
| ├──7.jpg
| ├──8.jpg
| ├──9.jpg
|
├──sub_B2
├──10.jpg
├──11.jpg
├──12.jpg
这回答几乎似乎有解决方案,但计数器不会重置。
答案1
以下似乎有效:
find DirPath -type f -name "*.*"|\
for (( n=1;; ++n ));\
do l="`line`"||break; mv "$l" "${l%/*}/$n.${l##*.}"; done
此-name
子句的原因是,如果文件名中没有点,则拆分会失败,尽管您可能更喜欢-iname "*.jpg"
。do
可以详细说明此子句以处理无扩展名的文件名。
请注意,line
在文件末尾返回错误,因此||break
终止循环。
我建议echo
之前添加mv
以确保命令按预期工作:您可以保存此输出作为所做更改的参考。
如果您需要在分配编号之前对目录和文件进行排序(这似乎是明智的做法),请添加排序过滤器,并指定/
为字段分隔符:
find DirPath -type f -name "*.*"|sort -t /|\
for (( n=1;; ++n ));\
do l="`line`"||break; mv "$l" "${l%/*}/$n.${l##*.}"; done