【问题标题】:Moving certain specific files from a folder structure to another with same directory structure将某些特定文件从文件夹结构移动到另一个具有相同目录结构的文件
【发布时间】:2018-07-25 05:06:57
【问题描述】:

我在许多子文件夹中有数千个图像文件(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 或自动热键)(这些是我最喜欢的脚本语言)中的某些脚本来实现,但我不知道如何实现这一点。

请帮忙。

【问题讨论】:

  • 你试过什么? [如何创建最小、完整和可验证的示例][stackoverflow.com/help/mcve].你应该研究如何使用Get-ChildItem -Recurse -Filter ...Copy-Item 来实现你想要的。

标签: powershell cmd autohotkey


【解决方案1】:

你可以试试这样的:

#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

【讨论】:

  • 正如 OP abc 所解释的,BaseName 末尾的数字用下划线分隔 - 您的脚本没有考虑到这一点。您的$Query 可以在 $_.FullName 中的任何位置匹配。更改$Query = [RegEx]'_abc$'$_.Basename -match $Query
  • 是的,我写的时候根本没有想到,可能只是对什么OP ment有点困惑。感谢您的输入!我已经用您建议的正则表达式更新了脚本,并使用了基本名称而不是全名
  • 谢谢先生的回复。这正是我所需要的。文件名的最后 3 位数字代表图像文件的宽度或高度。但有时这些数字是不正确的,有没有一种快速的方法来检查文件的详细信息/属性,以便我可以找出它的真实宽度或高度?现在我使用 ImageMagick 来达到这个目的。请建议任何其他更快的方法来执行此操作,因为我有很多文件要排序。再次感谢...
猜你喜欢
  • 2022-08-21
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
相关资源
最近更新 更多