尝试根据文件大小重命名文件

时间:2018-10-09 21:51:23

标签: command-line batch-rename

我试图根据另一个目录中mp4文件的文件大小来重命名某些MP4文件。我想将所有大小相同的文件命名为相同的名称。这意味着,如果源文件的文件大小与比较目录中文件的大小匹配,则源文件将重命名为所比较文件的名称。因为两个目录都需要递归读取,所以我想通过使用DIR / s / b echo %%〜zs >> filesizelist.txt命令,可以更轻松地在两列中创建一个列表以与其中的信息进行比较我的清单是

123456789 movie.mp4

987654321 movie2.mp4

然后将所有源mp4传递到批处理文件,如果%%〜za与第一列中的值匹配,则将该文件传递给 相应的文件名。这是最好的路径吗?我试图编写脚本使其运行中,这既不可行,也是我三天头痛的根源(加上参考列表很少更改,并且很容易更新)。有人可以帮我编写脚本吗?

1 个答案:

答案 0 :(得分:0)

我使用mp4进行了一些测试,并且代码可以正常工作,并且在您执行测试时,您需要更改/在上面的这2行以及文件夹/目录的路径(一个要保留,另一个要保留到比较),通过在行中替换如下代码:

`set "_target_to_keeped=C:\Users\ecker\Videos\Target"`
`set "_target_to_rename=C:\Users\ecker\Videos\Ren_it"`

您需要在该测试的2行代码的同一行上添加要保留文件和重命名文件(如果大小+名称匹配)的文件夹(对不起,英语不好说,我的英语没有帮助)我)。到现在,已经是01:53了,我需要睡觉...是的!所以,有漂亮的代码!

  
@echo off && setlocal enableextensions enabledelayedexpansion 

cd /d "%~dp0"

set /a _cnt_in_looping= 1 - 1
set /a _cnt_files_size= 1 - 1

set "_target_to_keeped=C:\Users\ecker\Videos\Target"
set "_target_to_rename=C:\Users\ecker\Videos\Ren_it"

cd /d "!_target_to_keeped!"

for /f "tokens=* delims=^ " %%i in ('^<nul dir /o-d /on /b "*.mp4" 2^> nul ^| find "" /v /c') do set _cnt_in_looping=%%i

for /f "tokens=* delims=^ " %%i in ('^<nul dir /o-d /on /b "*.mp4"') do (

     set "_file_now_keep=%%i"
     set "_file_now_keeped=%%~zi %%i"

     call :_to_compare_:

    )

set /a _total_files_renamed=!_cnt_in_looping! - !_cnt_files_size!
set /a _total_files_n_chang=!_total_files_renamed! - !_cnt_in_looping! * -1

echo/Total of files renamed = !_total_files_renamed!
echo/Total of files n chang = !_total_files_n_chang!

endlocal 

goto :_end_of_file_:

:_to_compare_:

if not exist "!_file_now_keep!" exit /b 

for /f "tokens=*" %%I in ('^<nul dir /o-d /on /b "!_file_now_keep!"') do (

     set "_file_now_compare=%%~zI %%I"
     set "_path_now_compare=%%~dpI"

     if "!_file_now_compare!" == "!_file_now_keeped!" ( 

         rename "!_path_now_compare!\%%I" "%%~zI %%I"
         echo/ rename "%%~I" "%%~zI %%I" 

         if ["!errorlevel!"]==["0"] call set /a _cnt_files_size=!_cnt_files_size! + 1
         timeout /t 10
        )

    )

exit /b

:_end_of_file_: