[英]Windows batch - Move files to folders based on file name & extension
[英]Windows Batch create folders based on file names
我想基於如下文件名創建文件夾:
file with words 01.wav
file with words 02.wav
file with words 03.wav
file with more words 01.wav
file with more words 02.wav
...
樹應該看起來像這樣
Folder
|----file with words
|----file with words 01.wav
|----file with words 02.wav
|----file with words 03.wav
|----file with more words
|----file with more words 01.wav
|----file with more words 02.wav
並且其中的文件應保留其原始名稱。如何在每個數字之前尋址最后一個空格? 我無法為“令牌”指定固定值,因為最后一個空格的位置因文件而異。 這是我的方法:
FOR /f "tokens=1*" %%a IN (
'dir /b /a-d "* *.wav"'
) DO (
ECHO MD %%a
ECHO MOVE "%%a %%b" .\%%a\
)
PAUSE
-> ECHO
調試結果
@echo off
setlocal enableextensions disabledelayedexpansion
for %%a in (*.wav) do (
set "filename=%%~na"
setlocal enabledelayedexpansion
for %%b in ("::\!filename: =\!\..") do ( endlocal & set "filename=%%~pnxb" )
setlocal enabledelayedexpansion
for /f "tokens=*" %%b in ("!filename:\= !") do (
endlocal
if not exist "%%b\" md "%%b"
if exist "%%b*.wav" move /y "%%b *.wav" "%%b"
)
)
代碼背后的想法是遍歷文件列表,對於每個文件列表,名稱中的空格都用反斜杠( file\\with\\words\\01
)代替,因此我們可以使用for
可替換參數查詢“父”文件夾”(最后一個元素的名稱)(不帶結尾數字的名稱),然后將反斜杠替換為空格以獲取最終的文件夾名稱。
包含多個setlocal/endlocal
來處理可能包含感嘆號的文件名(啟用延遲擴展時的問題字符)。
該代碼嘗試僅使用一個move
命令move
每個集中的所有匹配文件,但是根據真實名稱,其他集中的文件也可能會匹配。 為了避免它,行
if exist "%%b*.wav" move /y "%%b *.wav" "%%b"
應該轉換成
move /y "%%a" "%%b\"
這樣一來,文件就不會出現任何問題。
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
PUSHD "%sourcedir%"
FOR /f "delims=" %%a IN (
'dir /b /a-d *.wav '
) DO (
SET "filename=%%a"
SET "dirname=%%a"
CALL :genmove
)
popd
GOTO :EOF
:genmove
IF "%dirname:~-1%" neq " " set "dirname=%dirname:~0,-1%"&goto genmove
set "dirname=%dirname:~0,-1%"
ECHO(MD "%dirname%"
ECHO(MOVE "%filename%" ".\%dirname%\"
GOTO :eof
您需要更改sourcedir
的設置以適合您的情況。
所需的MD命令只是ECHO
編用於測試目的。 驗證命令正確無誤后 ,將ECHO(MD
更改為MD
以實際創建目錄。附加2>nul
以禁止顯示錯誤消息(例如,當目錄已存在時)
所需的MOVE命令僅僅ECHO
編用於測試目的。 確認命令正確無誤后 ,將ECHO(MOVE
更改為MOVE
即可實際移動文件。Append >nul
可禁止報告消息(例如,已1 file moved
)
只需為文件和目錄生成相同的名稱,將名稱中的最后一個字符剪掉,直到該字符成為空格為止,然后將其剪掉,便有了所需的目錄名和文件名。
這是使用JREPL.BAT的版本-混合JScript /批處理實用程序,用於執行正則表達式文本替換。
此解決方案的優勢在於,它僅嘗試移動名稱與{baseName} {space} {digit} {digit}匹配的.wav文件,並且如果無法創建{baseName}文件夾,則不會移動文件,因為文件{baseName } 已經存在。 這些功能可以添加到已經發布的純批處理解決方案中。 但是,我發現通過JREPL.BAT構建健壯的解決方案更加容易。
@echo off
for /f "tokens=1,2 delims=:" %%A in (
'dir /b "* ??.wmv" ^| jrepl "(.+?) +\d\d\.wmv$" "$1+':'+$0" /i /jmatch'
) do (
if not exist "%%A\" if not exist "%%A" (
md "%%A"
) else echo Can't create folder "%%A" because a file exists with that name
if exist "%%A\" move "%%B" "%%A" >nul
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.