尝试根据文件大小重命名文件
Trying to rename files based on file size
我正在尝试根据另一个目录中 mp4 文件的文件大小重命名一些 MP4 文件。我想将所有大小相同的文件命名为相同的名称。这意味着如果源文件的文件大小与比较目录中文件的大小匹配,则源文件将重命名为比较文件的名称。因为这两个目录都需要递归读取,所以我认为通过使用 DIR /s /b echo %%~zs>>filesizelist.txt 来制作一个列表以便与 2 列中的信息进行比较会更容易命令给我一个像
这样的列表
123456789 电影.mp4
987654321 电影2.mp4
然后将所有源 mp4 传递到批处理文件,如果 %%~za 与第一列中的值匹配,则将文件发送到
对应的文件名。这是最好的路径吗?我试图编写脚本让它在运行中运行,但这是行不通的,也是我 3 天头痛的根源(加上参考列表很少更改,而且显然很容易更新)。有人可以帮我写剧本吗?
我用我的 mp4 做了一些测试,代码有效,要执行测试,您需要 change/put 上面的这两行以及 folder/directory 的路径(一个保留另一个比较),通过替换行代码是这样的:
`set "_target_to_keeped=C:\Users\ecker\Videos\Target"`
`set "_target_to_rename=C:\Users\ecker\Videos\Ren_it"`
您需要在同一行添加要保留的文件和要重命名的文件(如果大小+名称匹配)的文件夹,这是该测试中两行代码所在的位置(抱歉无法用流利的英语解释,我的英语是帮不了我)。到现在,已经很晚了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_:
我正在尝试根据另一个目录中 mp4 文件的文件大小重命名一些 MP4 文件。我想将所有大小相同的文件命名为相同的名称。这意味着如果源文件的文件大小与比较目录中文件的大小匹配,则源文件将重命名为比较文件的名称。因为这两个目录都需要递归读取,所以我认为通过使用 DIR /s /b echo %%~zs>>filesizelist.txt 来制作一个列表以便与 2 列中的信息进行比较会更容易命令给我一个像
这样的列表123456789 电影.mp4
987654321 电影2.mp4
然后将所有源 mp4 传递到批处理文件,如果 %%~za 与第一列中的值匹配,则将文件发送到 对应的文件名。这是最好的路径吗?我试图编写脚本让它在运行中运行,但这是行不通的,也是我 3 天头痛的根源(加上参考列表很少更改,而且显然很容易更新)。有人可以帮我写剧本吗?
我用我的 mp4 做了一些测试,代码有效,要执行测试,您需要 change/put 上面的这两行以及 folder/directory 的路径(一个保留另一个比较),通过替换行代码是这样的:
`set "_target_to_keeped=C:\Users\ecker\Videos\Target"`
`set "_target_to_rename=C:\Users\ecker\Videos\Ren_it"`
您需要在同一行添加要保留的文件和要重命名的文件(如果大小+名称匹配)的文件夹,这是该测试中两行代码所在的位置(抱歉无法用流利的英语解释,我的英语是帮不了我)。到现在,已经很晚了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_: