使用计数器重命名子目录中的文件

使用计数器重命名子目录中的文件

我有一个父目录,里面有许多目录。在这些目录中,我又有多个子目录,它们包含许多图像:

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

相关内容