簡體   English   中英

使用文件名中的特定模式將文件從一個目錄分組到另一個目錄

[英]Group files from a directory to another directory with a particular pattern in filename

因此,我有一個目錄(D:\\ Project \\ Archive),其中包含很多.txt文件,它們的文件名模式不同,但擴展名前的最后9個字符除外。 我列舉了6個文件名作為示例:

  • 123456_HTQB_1412.txt
  • abcd_GGTL_7642.txt
  • 1a2b3_HTQB_1412.txt
  • pikachu_JTYU_7177.txt
  • hsbhsd_GGTL_7642.txt
  • yt7777_HTQB_7642.txt

這些文件沒有特定的順序。 顯而易見的是,文件名的最后9個字符(在擴展名之前)遵循4個字符的模式,后跟一個下划線,后跟4個數字。 這9個字符對於幾個文件將是相同的。

我的目標是歸檔具有相同9個字符的文件,而不管文件數量如何。 zip文件的名稱應為帶有模式的9個字符,文件名應不包含這9個字符。 上面的示例應創建3個存檔文件:

  • HTQB_1412.zip-包含123456_.txt,1a2b3_.txt,yt7777_.txt。
  • GGTL_7642.zip-包含abcd_.txt,hsbhsd_.txt。
  • JTYU_7177.zip-包含pikachu_.txt。

我進行分組的方法是提取第一個文件名的模式,將文件移至_toArchive目錄,然后循環瀏覽其余文件以檢查相同的模式。 如果匹配,則將其移動到目錄_toArchive,並繼續直到到達內部循環的末尾。 然后,腳本將遍歷到_toArchive,並壓縮文件。 然后控件返回到第一個循環以對其余文件重復相同的操作。

我面臨的問題主要是分組問題。 即使邏輯工作正常,但啟用延遲擴展后,即使文件已移至其他目錄,變量仍保留值。 當循環嘗試訪問那些文件時,這會導致不必要的開銷,從而導致“找不到文件”錯誤消息。 有沒有辦法通過使用數組來取消設置變量? 還是其他比我正在使用的方法容易的方法?

我只是發布分組操作的代碼,因為一旦弄清楚了,我將能夠實現其余的代碼。

set WORKDIR=D:\Project\Archive
setLocal enableDelayedExpansion
for /f "tokens=*" %%g in ('dir /b %WORKDIR%\*.txt') do (
    set firstFile=%%~ng
    set firstPattern=!firstFile:~-9!
    move /y %WORKDIR%\%%g %WORKDIR%\_toArchive
    call :checkPatterns
)
:checkPatterns
    for /f "tokens=*" %%i in ('dir /b %WORKDIR%\*.txt') do (
        set fileToGroup=%%i
        set groupedFile=%%~ni
        set groupedPattern=!groupedFile:~-9!
        call :groupPatterns
    )
:groupPatterns
    if "%groupedPattern%" == "%firstPattern%" (
        move /y %WORKDIR%\%fileToGroup% %WORKDIR%\_toArchive
    )

我建議采取另一種方法:

  • 遍歷所有文件並為每個組構建一​​個環境(數組)變量
  • 遍歷組並將文件(具有短名稱)移動(或復制)到組-文件夾中
  • 將文件壓縮在組文件夾中,然后刪除組文件夾

以下批次要求7zip可以在路徑中的某處到達:

:: Q:\Test\2019\01\14\SO_54189436.cmd
@Echo off&SetLocal EnableDelayedExpansion

set WORKDIR=D:\Project\Archive

:: clear Group[] variables
for /f "delims==" %%A in ('Set Group[ 2^>Nul') Do set "%%A="

:: get groups
for /f "tokens=*" %%g in ('dir /b %WORKDIR%\*.txt') do (
    set FileName=%%~ng
    set "Group[!FileName:~-9!]=!FileName:~-9!"
)
set Group[
:: procss groups
for /f "tokens=2 delims==" %%A in ('Set Group[ 2^>Nul') Do (
  MD "%WORKDIR%\%%A" 1>Nul 2>&1
  for %%B in ("%WORKDIR%\*%%A.txt") Do Call :MoveRenFile "%%A" "%%B"
  Rem zip files and delete group folder
  PushD "%WORKDIR%\%%A"
  7z a "..\%%A.zip" *
  PopD
  RD /S /Q "%WORKDIR%\%%A" 
)

Goto :Eof
:MoveRenFile
Set "File=%~nx2"
set "NewName=%WORKDIR%\%~1\!File:_%~1=!"
Echo Move "%~2" "%NewName%"
     Move "%~2" "%NewName%" >NUL
Goto :Eof

文件被重命名並存儲在組文件夾中的中間結果:

> tree %Workdir% /F
└───Project
    └───Archive
        ├───GGTL_7642
        │       abcd.txt
        │       hsbhsd.txt
        │
        ├───HTQB_1412
        │       123456.txt
        │       1a2b3.txt
        │
        ├───HTQB_7642
        │       yt7777.txt
        │
        └───JTYU_7177
                pikachu.txt

最終結果與zip文件:

> tree /F D:\
D:\
└───Project
    └───Archive
            GGTL_7642.zip
            HTQB_1412.zip
            HTQB_7642.zip
            JTYU_7177.zip

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM