将某些特定文件从文件夹结构移动到具有相同目录结构的另一个文件

时间:2018-07-24 14:47:17

标签: powershell cmd autohotkey

我在许多子文件夹中都有数千个图像文件(jpg,PNG,gif等)。例子

images\2018\jan\baba\hello1_abc.jpg
images\2018\jan\kaka\hello6_pqr.gif
images\2016\mar\baby\hello7_abc.png
images\2018\jan\yoga\hello3_xyz.jpg
images\2018\jan\yoga\hello345_abc.bmp

等等等等

(ABC,pqr,XYZ是表示某些文件属性的3位数字)

现在,在不干扰目录结构的情况下,我想移动名称中包含abc的所有文件。使其按年,月,主题和“ abc”,“ xyz”,“ pqr”排序。喜欢,

images\abc\2018\jan\baba\hello1_abc.jpg
images\abc\2016\mar\baby\hello7_abc.png
images\abc\2018\jan\yoga\hello345_abc.bmp
images\2018\jan\kaka\hello6_pqr.gif
images\2018\jan\yoga\hello3_xyz.jpg

现在我使用手动方法,即

  1. 我在“ C:\ images”中搜索“ abc”。
  2. 删除名称中包含“ abc”的结果文件。 (将它们移动到回收站)
  3. 将父文件夹“ images”重命名为“ images1”。
  4. 然后还原已删除的文件,这些文件将自动创建并创建先前的目录结构。
  5. 然后使用“删除空目录”软件删除所有空文件夹。

尽管此方法可以按我的预期工作,但它非常慢,因为我的图像集超过了数千张图像。 搜索,删除和还原它们非常耗时。

我知道这可以通过使用某些脚本(does,powershell或自动热键)(这是我最喜欢的脚本语言)来实现,但是我不确定如何实现。

请帮助。

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

#Search query
$Query = [RegEx]'_abc$'

#Root of search and place for new structure.
$FileRoot = "C:\images\"

#Get all files in the desired structure that match your search query
$Files = Get-ChildItem -Path $FileRoot -Recurse | Where-Object { ! $_.PSIsContainer -and $_.Basename -match $Query }


foreach ($File in $Files) {
    #Generates a new path
    $NewPath = $FileRoot + $Query + "\"+ $File.DirectoryName.Replace("$FileRoot","")

    #Create the folder if it is not already created and move the item.
    New-Item -Path $NewPath -ItemType directory
    Move-Item -Path $File.Fullname -Destination $NewPath
}

我已经做了一些轻量的测试,但是可能有些事情没有考虑到您的文件结构。

您可以将一些文件夹复制到c:\ images1 \之类的测试中,然后尝试在该文件夹中运行脚本。只需更改$ FileRoot变量“

为了选择要查找的文件,请更改$ Query变量。

结果应该是将所有包含“ ABC”的文件都移动到:

C:\images\abc\RestOfThePathTheItemHadBefore\file_abc.ext