파일 이름에 따라 파일을 폴더로 정렬하는 방법-Windows CMD /l %i in (1001,1,1214) do

CMD / PowerShell 명령을 사용하여 파일 이름에 따라 파일을 폴더로 정렬하려면 어떻게합니까?

많은 파일 (20,000 개가 넘는 파일)이 포함 된 폴더가 있는데 모든 파일의 이름 지정 규칙이 다음과 같습니다 (예 : 패턴에 유의).

t_1001_1801.png
t_1001_1802.png
t_1001_1803.png
...
t_1001_2112.png (last file starts with 't_1001_')
t_1002_1801.png
t_1002_1802.png
t_1002_1803.png
....
t_1002_2112.png
t_1003_1801.png
t_1003_1802.png
t_1003_1803.png
...
t_1214_2112.png (last file in folder)

이 CMD 명령을 실행하여 폴더 목록
for /l %i in (1001,1,1214) do md x%i
을 만듭니다. 폴더 목록을 만듭니다. 예 :

x1001
x1002
x1003
...
x1214

이제 파일 이름에 따라 파일을 폴더로 정렬 (이동)하고 싶습니다.

- move the files t_1001_1801.png to t_1001_2112.png to the folder x1001.
- move the files t_1002_1801.png to t_1002_2112.png to the folder x1002.
...

이 목적으로 쉘 명령을 사용할 수 있습니까?



답변

FileName을 분할하고 숫자 (예 : 1001)를 가져 와서 숫자를 폴더와 비교하고 올바른 폴더를 가져 와서 파일을 이동하면됩니다.

# Folder where Files and Folders are located
$TopFolder = "C:\Install"

# Getting Folders and Files
$Folders = gci $TopFolder -OutVariable Files | ? { $_.PSisContainer }

# Loop over all Files with *.png extension
$Files | ? { $_.Extension -eq '.png' } | % {

    # Split FileName to get the number (like 1001)
    $num = ($_.Name -split "_")[1]

    # Get FolderName by reading out foldername (without 'x') and compare it to number
    $MoveTo = $Folders | ? { $_.Name.substring(1,($_.Name.length -1)) -eq $num }

    # If a folder was found, move file there. else print error
    if ($MoveTo)
    {
        Move-Item $_.FullName $MoveTo -Force
        Write-Host "Copied File $($_.Name) to $MoveTo"
    }
    else
    {
        Write-Host "Did not find folder x$($num) in $TopFolder"
    }
}

답변

다음 배치

  • 시작할 폴더로 변경
  • 모든 * .png 파일을 통해 for 명령으로 반복
  • for / f를 사용하여 밑줄의 이름을 토큰으로 나누고 두 번째 3 번째 이름을 사용하여
  • 번호가있는 하위 폴더 x가 존재하는지 확인하십시오.
  • 마지막으로 파일을 하위 폴더로 이동합니다.

:: Q:\Test\2018\06\03\SU_1328200.cmd
@Echo off
PushD "C:\Users\UserName\Pictures\"

For %%A in (t_*_*_*.png) do For /F "tokens=3delims=_" %%B in ("%%A") Do (
  If Not exist "x%%B" MD "x%%B"
  Move "%%A" "x%%B"
)
PopD

배치를 실행 한 후 샘플 트리 / F
(두 번째 토큰으로 첫 번째 요구 사항보다 오래됨)

> tree /F
├───x1001
│       t_1001_1801.png
│       t_1001_1802.png
│       t_1001_1803.png
│       t_1001_2112.png
│
├───x1002
│       t_1002_1801.png
│       t_1002_1802.png
│       t_1002_1803.png
│       t_1002_2112.png
│
├───x1003
│       t_1003_1801.png
│       t_1003_1802.png
│       t_1003_1803.png
│
└───x1214
        t_1214_2112.png

PowerShell 스크립트 :

## Q:\Test\2018\06\03\SU_1328200.ps1
PushD  "C:\Users\UserName\Pictures\"
Get-ChildItem t_*_*_*.png |
  Where BaseName -match 't_\d{2}_(\d{4})_\d{4}'|
    Group {'x'+$Matches[1]}|
      ForEach{MD $_.Name;$_.Group|Move -Dest $_.Name}

답변

@Neil에게 감사의 말을 전하며 (댓글에) 다른 사람의 답변으로 게시하고 싶습니다.

for /l %i in (1001,1,1024) do md x%i&move t_%i_* x%i

설명 :
-1001에서
1024까지의 % i에서 루프 (1은 반복 단계)
-각 반복마다 다음을 수행
하십시오.
2. 정규식 t_ % i _ * (t_1001_1801)와 일치하는 파일을 x % i (방금 작성된) 디렉토리로 이동하십시오.