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