Search code examples
command-linebatch-rename

Trying to rename files based on file size


I am trying to rename some MP4 files based on file size of mp4 files in another directory. I want to name all files with identical sizes to same name. Meaning if the file size of the source file matches the size of file in the comparison directory, the source file is renamed to whatever the compared file is named. Because both directories need to be read recursively I'm thinking it would be easier to make a list for comparison with the info in it in 2 columns by using the DIR /s /b echo %%~zs>>filesizelist.txt command giving me a list like

123456789 movie.mp4

987654321 movie2.mp4

Then pass all source mp4s to the batch file and if %%~za matches a value in first column then ren the file to the corresponding filename. Is this the best path? I tried to script it to work on the fly and that was both a no-go and the source of my 3 day headache(plus the reference list rarely changes and is obviously easily updated). Can someone please assist me with the script?


Solution

  • I do some test with my mp4, and the code works, and for you perform your test, you w´ll need change/put this 2 line above with the path to your folder/directory (one to keep and another to compare), by replacing in the line code is like this:

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

    You need add the folder where are files to keep and files to rename (if size+name match) on same lines where are the 2 lines code up in this test (sorry not explain in good English, my English is not help me). By now, is late 01:53, i need sleep... yep! so, have nice code!

    @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_: