web-dev-qa-db-ja.com

ファイル名に従ってファイルをフォルダーにソートする方法-Windows CMD

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

この目的でシェルコマンドを使用できますか?

5
Gil Epshtain

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

次のバッチ

  • 開始するフォルダへの変更
  • すべての* .pngファイルをforコマンドで反復する
  • for/fを使用して、アンダースコアの名前をトークンに分割し、 2番目 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
(2番目のトークンによる最初の要件から古くなっています)

> 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}
6
LotPings

@ Neilへのクレジット、彼の回答(コメント内)については、他の人への回答として投稿したいだけです。

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

説明:
-1001から1024までの%iでループします(1は反復ステップです)
-反復ごとに次を実行します。
1。 x%i(x1001、x1002、...)という名前のディレクトリを作成します。
2。正規表現t_%i_ *(t_1001_1801)に一致するファイルを、ディレクトリx%i(作成されたばかり)に移動します。

0
Gil Epshtain