파일 이름에 따라 파일을 폴더로 정렬하는 방법-Windows CMD


5

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.
...

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


당신의 이름 바꾸기 / 이동을 미리 더불어, UI 너무 매우 강력한 정규식 배치 도구 이름 바꾸기 파일 PFrank을 체크 아웃 : www3.telus.net/pfrank이
therobyouknow

1
이것을 시도하지는 않았지만 어떻 for /l %i in (1001,1,1024) do md x%i&mv t_%i_* x%i습니까?
Neil

답변:


8

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" 
    }
}

이 스크립트를 실행하는 방법? .bat파일을 만들고 스크립트를 복사했지만 오류로 인해 스크립트가 실행되지 않았습니다.
Gil Epshtain

@GilEpshtain은 PowerShell 스크립트입니다. .ps1대신 파일 을 만들어야합니다 .bat. 그런 다음 마우스 오른쪽 버튼으로 클릭
-powershell로

고마워, 그것은 잘 작동합니다. 실제 파일 이름이 t_25_1001_1801.png (원래 질문이 아닌)이므로 스크립트를 조금만 변경하면 되므로이 변경을 수행했습니다 $num = ($_.Name -split "_")[2].
Gil Epshtain

큰! 이 경우에는 [2]가 맞습니다.
SimonS

5

다음 배치

  • 시작할 폴더로 변경
  • 모든 * .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}

CMD 스크립트를 시도했지만 결과가 예상과 다릅니다. 루트 폴더 이름과 함께 생성 된 폴더 목록 (x1001, x1002, ...)과 추가 폴더가 생성되었습니다. "루트"이름으로 폴더에 복사 된 모든 파일보다. 나머지 폴더는 비어있었습니다. 오류로 인해 셸 스크립트가 전혀 실행되지 않았습니다.
Gil Epshtain

흠없이 내 램 디스크에서 배치를 테스트했는데 배치를 복사하여 붙여 넣은 다음 폴더를 변경 했습니까?
LotPings 2016 년

1
내 실수 였어 고마워 작은 변화가 필요했습니다. 실제 파일 이름은 t_25_1001_1801.png (원래 질문이 아님) For /F "tokens=3delims=_"
이므로이

1
배치 / 스크립트를 수정했습니다. BTW 내 PowerShell 스크립트는 허용 된 답변보다 엄격하고 오류가 없으며 빠르며 짧으며 필요한 폴더 자체를 만듭니다.
LotPings

0

@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 (방금 작성된) 디렉토리로 이동하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.