Board logo

标题: [文件操作] 批处理如何给文件名最后的数字改成3位数,不足三位用0补上? [打印本页]

作者: mofangti    时间: 2018-10-15 08:34     标题: 批处理如何给文件名最后的数字改成3位数,不足三位用0补上?

我有多个文件夹,每个文件夹有多个文件,如何给每个文件名最后的数字改成3位数,不足三位用0补上
作者: Batcher    时间: 2018-10-15 09:00

文件夹名称发几个出来看看有什么规律
作者: mofangti    时间: 2018-10-17 11:10

文件夹都是按数字依次排列的,如1(1),1(2),...2 (1),2 (2),...,文件名英文与数字都有,但是最后几位是数字,从0,1,2,往下排。
例如0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low0
0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low1
0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2
.每个文件夹下的文件数不超过1000
我希望每个文件夹下的文件按000,001,002, 排列即可
作者: zuodx    时间: 2018-10-17 13:35

use strict;

my        @files = glob('*.*');

foreach (@files){
        my $old = $_;
        m/^(.*)\.(.*)$/;
        #print "$1 $2----";
        my $name    =  $1;
        my $postfix =  $2;
       
        $name =~ m/^(.*\D)(\d+)$/;
        #print "$1 $2\n";
        my ($f1 , $f2)  = ($1 , $2);
        ('0000' . $f2) =~ m/(.{3})$/;
        $f2 = $1;
        #print "$f2\n";
        my $new = $f1 . $f2 . '.' . $postfix;
        #print "$new\n";
        rename($old  , $new);
}


#把以上内容拷贝到一个文件 ren.pl
#安装perl  在每一个目录执行这个程序
作者: mofangti    时间: 2018-10-17 14:40

回复 4# zuodx


    不管用
作者: mofangti    时间: 2018-10-19 09:10

回复 2# Batcher


    文件夹都是按数字依次排列的,如1(1),1(2),...2 (1),2 (2),...,文件名英文与数字都有,但是最后几位是数字,从0,1,2,往下排。
例如0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low0
0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low1
0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2
.每个文件夹下的文件数不超过1000
我希望每个文件夹下的文件按000,001,002, 排列即可
作者: lifei259    时间: 2018-10-19 10:00

本帖最后由 lifei259 于 2018-10-22 10:33 编辑

没考滤文件的排序,这是DOS的一个短板。
作者: mofangti    时间: 2018-10-19 16:23

回复 7# lifei259


    你这个不对,没考虑顺序,1后面没接上2,而成了10
作者: mofangti    时间: 2018-10-19 16:27

回复 2# Batcher
作者: xczxczxcz    时间: 2018-10-19 19:24

回复 9# mofangti

没有后缀的文件不修改,文件名末尾没有数字的不修改。不重新排序。只对后面的数字补全3位数。
  1. @echo off & cd /d "%~dp0" & setlocal EnableDelayedExpansion
  2. for /f "delims=" %%a in ('dir/a-d/b/s *.*') do (
  3. if "%%~xa" neq "" (
  4. call :AAA "%%~na"
  5. if "!ext!" neq "" (
  6. set "ext=0000!ext!"
  7. echo ren "%%a" "!str!!ext:~-3!%%~xa"
  8. )
  9. )
  10. )
  11. pause & exit
  12. :AAA
  13. set "ext="
  14. set "str=%~1"
  15. :LOOP
  16. echo %str:~-1%|findstr "^[0-9]$">nul&&(set "ext=%str:~-1%%ext%" &set "str=%str:~0,-1%"&goto LOOP)|| goto :eof
复制代码
=========================================
上面为演示。实际操作把第7 行 "echo ren" 改为"ren" 即可。
作者: WHY    时间: 2018-10-19 20:15

本帖最后由 WHY 于 2018-10-20 20:28 编辑

test.ps1
  1. dir e:\Test\ -Include *[0-9].* -Recurse | ForEach{
  2.     $name = [regex]::Replace($_.BaseName, '\d{1,3}$', {param($a); $a.Value.PadLeft(3, '0')});
  3.     $name += $_.Extension;
  4.     ren -Literal $_.FullName -NewName $name -WhatIf;
  5. }
复制代码
Microsoft Windows [版本 10.0.17134.345]
(c) 2018 Microsoft Corporation。保留所有权利。

C:\Users\WHY>dir /b /s /a-d E:\Test\
E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low08.doc
E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2.7z
E:\Test\a\1.LOG
E:\Test\a\a.txt
E:\Test\a\ccc1.jpg
E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low08.doc
E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2.7z

C:\Users\WHY>PowerShell -ExecutionPolicy ByPass -f Desktop\Test.ps1
WhatIf: 正在目标“项: E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low08.doc 目标: E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low008.doc”上执行操作“重命名文件”。
WhatIf: 正在目标“项: E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2.7z 目标: E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low002.7z”上执行操作“重命名文件”。
WhatIf: 正在目标“项: E:\Test\a\1.LOG 目标: E:\Test\a\001.LOG”上执行操作“重命名文件”。
WhatIf: 正在目标“项: E:\Test\a\ccc1.jpg 目标: E:\Test\a\ccc001.jpg”上执行操作“重命名文件”。
WhatIf: 正在目标“项: E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low08.doc 目标: E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low008.doc”上执行操作“重命名文件”。
WhatIf: 正在目标“项: E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2.7z 目标: E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low002.7z”上执行操作“重命名文件”。

C:\Users\WHY>

作者: WHY    时间: 2018-10-20 20:30

本帖最后由 WHY 于 2018-10-21 17:01 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. for /L %%i in (0 1 9) do set _%%i=1
  3. for /f "delims=" %%i in ('dir /b /a-d /s E:\Test\*') do (
  4.     set "Name=##%%~ni"
  5.     for /f "tokens=1-3 delims=/" %%n in ("!Name:~-3,1!/!Name:~-2,1!/!Name:~-1!") do (
  6.         if "!_%%n!.!_%%o!.!_%%p!" == ".1.1" (
  7.             echo;ren "%%i" "!Name:~2,-2!0!Name:~-2!%%~xi"
  8.         ) else if "!_%%o!.!_%%p!" == ".1" (
  9.             echo;ren "%%i" "!Name:~2,-1!00!Name:~-1!%%~xi"
  10.         )
  11.     )
  12. )
  13. pause
复制代码
不考虑特殊字符,不考虑重名问题。
作者: mofangti    时间: 2018-10-22 09:00

回复 12# WHY

有效,谢谢
作者: mofangti    时间: 2018-10-22 09:00

回复 10# xczxczxcz


    有效,谢谢
作者: mofangti    时间: 2018-10-22 09:45

回复 11# WHY
作者: WHY    时间: 2018-10-22 11:03

回复 15# mofangti


    powershell 2.0版本中 rename-Item 不支持 -literalPath 参数,你可以改成 -Path,或者更新 PowerShell 版本。
作者: mofangti    时间: 2018-10-23 18:18

回复 16# WHY


怎么文件没有变化?
作者: Batcher    时间: 2018-10-23 21:27

回复 17# mofangti


    把-WhatIf去掉




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2