2013-12-16 86 views
0

我有一個非常大量的文件與此模板:批處理文件移動特定文件

example1.part001.rar 
example1.part002.rar 
example1.part003.rar 
... 

example2.part001.rar 
example2.part002.rar 
example2.part003.rar 
... 

,有時與後「部分」

example3.part01.rar 
example3.part02.rar 
example3.part03.rar 
... 

我試圖創建只有兩位數一個批處理文件,首先製作n目錄(n用於文件組的數目),名稱爲「示例n」,然後將所有親屬文件進入他們。 我會解釋得更好。

cat.part01.rar 
cat.part02.rar 
cat.part03.rar 
dog.part001.rar 
dog.part002.rar 
mouse.part01.rar 
mouse.part02.rar 
mouse.part03.rar 
mouse.part04.rar 

我想先目錄「貓」,「狗」和「鼠標,然後將所有的親戚文件放進去(我的意思是所有的」 foldername.part * .rar程序在「文件夾名稱」),所以「cat.part * .rar」文件到「貓」文件夾等等。 文件很多,文件名非常不同,也是隨機的。

有人可以幫我嗎?謝謝

+0

你想創建一個腳本,並要求你遇到的具體問題,而不是請人做全對你的工作...... –

+0

我向你保證我曾嘗試與,DIR但我不能找到一個解決方案... – user3108650

回答

0

這裏我通過'。'分割文件名得到一個組列表。然後我得到第一列的uniq值。對於每個結果我創建目錄。然後,所有文件拷貝到目錄

#/usr/bin/sh 

groupnames=(`ls *.rar | awk -F"." '{print $1}' | uniq`) 

for i in ${groupnames[*]}; do 

    mkdir $i 
    mv $i.*.rar ./$i/ 

done 
+0

我認爲這是針對Linux的,我一直在尋找Windows ...無論如何,謝謝! – user3108650

1

編輯:

@echo off&cls 
setlocal EnableDelayedExpansion 

for %%a in (*.rar) do (set $file=%%~na 
         set $file=!$file:^.= ! 
         call:work %%a) 
exit /b 
:work 
for %%b in (!$file!) do (if not exist %%b md %%b 
         copy "%1" ".\%%b" 
         exit /b) 
+0

這很完美!謝謝!我只需要用「移動」替換「複製」。簡單,整潔和簡短,這是我尋找的解決方案!再次感謝您 – user3108650

+0

您能回答這個問題嗎,請 – SachaDee

+0

哦對不起,我發現了一個問題......許多文件都有「abc.def.ghi.part01.rar」這樣的名字,所以分隔符「。」。不能使用...我試圖把「.part」作爲分隔符,但它認爲。,p,a,r,t分開而不是單個單詞......我該如何解決這個問題?謝謝 – user3108650

0

測試示例文件:

ball.part1.rar
ball.part2.rar

貓。 part01.rar
cat.part02.rar

dog.part001.rar
dog.part002.rar

的腳本創建文件夾,在那之後,它的文件移動到它們各自的文件夾,與部分工作X,部分XY和部分XYZ在文件名

@echo off 
@break off 
@title Batch file move specific files 
@color 0a 
@cls 

setlocal EnableDelayedExpansion 

if "%~1" NEQ "" (
    set "WORKINGDIR=%~1" 
) else (
    set "WORKINGDIR=!CD!" 
) 

if not exist "!WORKINGDIR!\*.rar" (
    set "WORKINGDIR=!CD!" 
) 

if not exist "!WORKINGDIR!\*.rar" (
    echo There are no winrar files in this directory 
    echo. 
    echo Exiting... 
    echo. 
    ping -n 4 localhost>nul 
    pause 
    exit 
) 

for %%a in ("!WORKINGDIR!\*.rar") do (
    set "name=%%~nxa" 
    if "!name:~-4!" EQU ".rar" (
    set "name=!name:~0,-4!" 
) 
    if "!name:~-8,5!" EQU ".part" (
    echo !name:~-7! | find ".">nul 
    if "!errorlevel!" NEQ "0" (
     set "name=!name:~0,-8!" 
    ) else (
     set "skip=yes" 
    ) 
) else if "!name:~-7,5!" EQU ".part" (
    echo !name:~-6! | find ".">nul 
    if "!errorlevel!" NEQ "0" (
     set "name=!name:~0,-7!" 
    ) else (
     set "skip=yes" 
    ) 
) else if "!name:~-6,5!" EQU ".part" (
    echo !name:~-5! | find ".">nul 
    if "!errorlevel!" NEQ "0" (
     set "name=!name:~0,-6!" 
    ) else (
     set "skip=yes" 
    ) 
) 
    if not defined skip (
    set "skip=no" 
) 
    if "!skip!" EQU "no" (
    if not exist "!WORKINGDIR!\!name!\" (
     mkdir "!WORKINGDIR!\!name!\" 
    ) 
    move /y "!WORKINGDIR!\%%~nxa" "!WORKINGDIR!\!name!\%%~nxa" 
) 
    set "skip=no" 
) 

pause 
exit 
+0

它的工作原理,謝謝! 用戶sachadee找到了一個較短的解決方案,但最終結果是一樣的。也許你的代碼有更多,因爲它是最長的? – user3108650

+0

是的,確切地說。我做了一個更大的代碼來避免可能的錯誤我想象一下,在某些文件名中帶點的文件可能會出現什麼情況,還有一部分用於處理參數目錄,例如,您可以調用script.bat「Directory」作爲參數傳遞%〜1 for script.bat,但是如果你直接調用script.bat,它會使用當前目錄工作,所以你可以把腳本放到文件夾中並且運行良好,還有檢查是否有文件在WinRAR文件夾中。 – D3F4ULT

+0

我最大的原因是因爲這些原因,通常當郵政編碼批處理腳本,很少編程所以做必要的檢查,只是使代碼工作,我總是儘量保持代碼中的兼容性和更高的可靠性。這就像我說的,這不是因爲代碼的作品,你想說的代碼是正確的。好的編程實踐,即使在批處理腳本中也是可能的。 – D3F4ULT

1

這應該這樣做還,並處理文件名!

@echo off 
for %%a in (*.rar) do (
if exist "%%a" for %%b in ("%%~na") do (
    md "%%~nb" 2>nul 
    move "%%~nb.part*.rar" "%%~nb" >nul 
) 
) 
pause 
相關問題