将文件批量复制到与文件名匹配的新目录

时间:2012-02-08 13:17:57

标签: powershell batch-file cmd

我在一个目录中有250.000个文件 这些文件都采用

格式
1a.jpg  
1b.jpg  
1c.jpg  

...然后上升到1f.jpg然后数字增加一个

2a.jpg  
2a.jpg  
2c.jpg  

......等等。

现在我想将所有以1开头的文件复制到名为1的新目录中 所有以2开头的文件到目录2,依此类推。

有人可以为此提供帮助吗?

4 个答案:

答案 0 :(得分:3)

按第一个字符对所有文件进行分组,然后将每个组复制到目标文件夹:

Get-ChildItem -Filter *.jpg | Group-Object {$_.Name[0]} | Foreach-Object { $_.Group | Copy-Item -Destination "C:\test\$($_.Name)" }

编辑:这应该更快地执行:

Get-ChildItem *.jpg | Copy-Item -Destination { "C:\test\$($_.Name[0])" }

答案 1 :(得分:3)

如果您在一个目录名 n [af] .jpg中有250,000个文件,我希望 n 从1到41,667,你想拥有41,667个目录,每个目录有6个JPG文件。如果是这种情况,这是我的解决方案,更多涉及:

  • 首先,它从中删除字母(a-f)和扩展名.jpg item的FullName获取目标文件夹。
  • 接下来检查目标文件夹是否存在,如果不存在,则检查目标文件夹是否存在 创建。
  • 最后,该项目被复制到目标文件夹。

    Get-ChildItem *.jpg | ForEach-Object {
     $destination = $_.FullName -replace '[a-f]\.jpg'
     if (-not (Test-Path -Path $destination -PathType Container)) {
      $null = New-Item -Path $destination -ItemType directory
     }
     Copy-Item -Path $_.FullName -Destination $destination
    }
    

答案 2 :(得分:1)

尝试:

 dir -filter *.jpg | % { Copy-Item -PATH $_ -DESTINATION .\$($_.BaseName.ToCharArray()[0]) }

通过这种方式,目标文件夹必须存在!

答案 3 :(得分:0)

你可以试试这个"老式的" .BAT批处理文件,如果你愿意:

@echo off
setlocal EnableDelayedExpansion
for %%f in (*.jpg) do (
   set dir=%%~Nf
   set dir=!dir:~0,-1!
   if not exist !dir! md !dir!
   copy %%f !dir!   
)

将此批处理文件复制到文件所在的目录并执行它。它将在同一级别创建新目录,但您可以轻松修改它。