@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
PUSHD "%sourcedir%"
:: number of subdirectories
SET /a parts=4
:: make subdirs and initialise totalsizes
FOR /L %%a IN (1,1,%parts%) DO MD "%destdir%\sub%%a" 2>nul&SET /a $%%a=0
:: directory of sourcefiles, sort in reverse-size order
FOR /f "tokens=1*delims=" %%a IN (
'dir /b /a-d /o-s * '
) DO (
REM find smallest subdir by size-transferred-in
SET /a smallest=2000000000
FOR /L %%p IN (1,1,%parts%) DO IF !$%%p! lss !smallest! SET /a smallest=!$%%p!&SET part=%%p
REM transfer the file and count the size
ECHO(MOVE "%%a" "%destdir%\sub!part!"
REM divide by 100 as actual filelength possibly gt 2**31
SET "size=%%~za"
IF "!size:~0,-2!" equ "" (SET /a $!part!+=1) ELSE (SET /a $!part!=!size:~0,-2! + $!part!)
)
popd
GOTO :EOF
我相信這些言論應該解釋方法。其原理是記錄傳輸到每個子目錄的長度,並選擇最少填充爲文件的目的地(以反向大小順序處理)
由於批次的限制爲2^31,因此我選擇了粗略通過削減最後2位數字將文件大小除以100。對於文件< 100字節,我任意記錄爲100字節。
您需要更改sourcedir
和destdir
的設置以適合您的情況。
所需的MOVE命令僅爲ECHO
用於測試目的。 確認命令正確後,將ECHO(MOVE
更改爲MOVE
以實際移動文件。附加>nul
以禁止報告消息(例如,1 file moved
)
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "destdir=U:\destdir"
SET "spaces= "
FOR /f "delims=" %%a IN (
'dir /b /ad "%destdir%\*"'
) DO (
PUSHD "%destdir%\%%a"
FOR /f "delims=" %%f IN (
'dir /b /a-d "*.xyz" 2^>nul'
) DO (
IF EXIST "%%f.264" (
FOR %%k IN ("%%f.264") DO (
SET "sizexyz=%spaces%%%~zf"
SET "size264=%spaces%%%~zk"
IF "!sizexyz:~-15!" gtr "!size264:~-15!" (ECHO(DEL /F /Q "%%f") ELSE (ECHO(DEL /F /Q "%%f.264")
)
)
)
popd
)
GOTO :EOF
此第二批掃描數據夾入%%a
然後teporarily切換到detination目錄%destfile\%%a
。
一旦那裏,我們尋找.xyz
文件,並找到每一個找到相應的.xyz.264
文件。
如果存在,那麼我們找到文件的大小(%%~zk
或%%~zf
)並將其附加到一長串空格。通過比較結果的最後15個字符作爲字符串,我們可以確定哪個更長。
爲了測試目的,所需的DEL命令僅僅是ECHO
。 驗證命令是否正確後,將ECHO(DEL
更改爲DEL
以實際刪除文件。
(只有~n
選擇名稱部分)如果.264
文件是filename.264
代替filename.xyz.264
然後替換每個"%%f.264"
與"%%~nf.264"
。
要手動輸入源目錄名,使用
SET /p "sourcedir=Source directory "
要接受源目錄名作爲參數,使用
SET "sourcedir=%%~1"
來處理所有的文件,除了.h264
文件,更改
FOR /f "delims=" %%f IN (
'dir /b /a-d "*.xyz" 2^>nul'
) DO (
到
FOR /f "delims=" %%f IN (
'dir /b /a-d "*.*" 2^>nul'
) DO if /i "%%~xf" neq ".h264" (
其中*.*
意味着「所有文件」,並額外if
語句檢查擴展到文件名%%f
(%%~xf
)是否不等於(neq
).h264
和/i
指引「不管情況( case-我不敏感)「
哇,這真是太神奇了,每個子目錄在我做的測試中都完美分離! – darkshaed
有沒有辦法比較兩個文件具有完全相同的文件名,但擴展名不同,並自動刪除較大的文件?例如,如果我有500mb 1.mp4和200mb 1.h264腳本會刪除較大的文件? – darkshaed
非常感謝您的腳本,它運行得非常漂亮 – darkshaed