Windows系统查找多个文件夹里的重复文件

目录

powershell终端直接输入指令的方法

输出结果简陋

输出结果完整

编写、执行.ps1文件的方法

分类输出结果

根据文件名、长度、拓展名查找

根据MD5值查找

将结果写入文件中

代码解释(不重要,建议跳过)

报错

总结 


使用powershell工具,查找多个文件夹里的重复文件。不同指令及其效果展示,根据需要的效果选择使用对应方法。

前面是成品的方法,根据效果选择代码,代码复制即可用。

最后的总结和代码解释,可以根据需要调整代码。

powershell终端直接输入指令的方法

输出结果简陋

打开powershell终端,直接输入

Get-ChildItem -Path C:\222, D:\111 -Recurse  | Group-Object -Property Name | Where-Object { $_.Count -gt 1 }

 -Path的参数“ C:\222, D:\111 ”根据自己需要修改自己需要查找的文件夹。

结果输出在终端界面,输出效果:

Count Name                      Group
----- ----                      -----
    4 1.docx                    {1.docx, 1.docx, 1.docx, 1.docx}
    3 1.pptx                    {1.pptx, 1.pptx, 1.pptx}

路径可以改为中文路径 ,即“ C:\222”等路径中可以包含中文字符。

输出结果完整

打开powershell终端,直接输入

 Get-ChildItem -Path C:\222, D:\111 -Recurse  | Group-Object -Property Name | Where-Object { $_.Count -gt 1 }| Select-Object -ExpandProperty Group | Select-Object FullName, Length, CreationTime, LastWriteTime

 -Path的参数“ C:\222, D:\111 ”根据自己需要修改自己需要查找的文件夹。

结果输出在终端界面,输出效果:

FullName                      Length CreationTime       LastWriteTime
--------                      ------ ------------       -------------
C:\222\1.docx                  12175 2023/5/15 19:01:13 2023/5/15 16:41:39
D:\111\1.docx                  12175 2023/5/15 16:39:09 2023/5/15 16:41:39
D:\111\新建文件夹\1.docx                0 2023/5/15 16:39:44 2023/5/15 16:39:09
D:\111\新建文件夹\新建文件夹 (2)\1.docx      0 2023/5/15 16:39:53 2023/5/15 16:39:09
C:\222\1.pptx                      0 2023/5/15 19:01:13 2023/5/15 16:39:37
D:\111\1.pptx                      0 2023/5/15 16:39:37 2023/5/15 16:39:37
D:\111\新建文件夹\1.pptx                0 2023/5/15 16:39:44 2023/5/15 16:39:37

编写、执行.ps1文件的方法

编写、执行.ps1文件的方法可以实现复杂效果。

分类输出结果

在C:\222,D:\111两个文件夹查找:

新建文本文档,输入如下内容:

$folderspath = "C:\222", "D:\111"
$files = Get-ChildItem -Path $folderspath -Recurse | Where-Object { !$_.PSIsContainer }
$groups = $files | Group-Object -Property Name | Where-Object { $_.Count -gt 1 }

foreach ($group in $groups) {
    $group.Group | Select-Object FullName, Length, CreationTime | Sort-Object FullName | Format-Table -AutoSize
}

$folderspath = "C:\222", "D:\111"根据情况修改。

保存为“.ps1”为后缀的文件,如“111.ps1”。在powershell中输入“ .\111.ps1”执行该文件。

效果:

 .\12.ps1

FullName                                Length CreationTime
--------                                ------ ------------
C:\222\1.docx                            12175 2023/5/15 17:28:00
D:\111\1.docx                            12175 2023/5/15 16:39:09
D:\111\新建文件夹\1.docx                     0 2023/5/15 16:39:44
D:\111\新建文件夹\新建文件夹 (2)\1.docx      0 2023/5/15 16:39:53

FullName                 Length CreationTime
--------                 ------ ------------
C:\222\1.pptx                 0 2023/5/15 17:23:57
D:\111\1.pptx                 0 2023/5/15 16:39:37
D:\111\新建文件夹\1.pptx      0 2023/5/15 16:39:44

根据文件名、长度、拓展名查找

修改“ Group-Object -Property”参数,设置为所需的内容:

$folderspath = "C:\222", "D:\111"
$files = Get-ChildItem -Path $folderspath -Recurse | Where-Object { !$_.PSIsContainer }
$groups = $files | Group-Object -Property  Length, Name, Extension | Where-Object { $_.Count -gt 1 }

foreach ($group in $groups) {
    $group.Group | Select-Object FullName, Length, CreationTime | Sort-Object FullName | Format-Table -AutoSize
}

效果

FullName      Length CreationTime
--------      ------ ------------
C:\222\1.docx  12175 2023/5/15 19:01:13
D:\111\1.docx  12175 2023/5/15 16:39:09

FullName                 Length CreationTime
--------                 ------ ------------
C:\222\1.pptx                 0 2023/5/15 19:01:13
D:\111\1.pptx                 0 2023/5/15 16:39:37
D:\111\新建文件夹\1.pptx      0 2023/5/15 16:39:44

根据MD5值查找

根据文件的MD5值来查找相同文件

$folderspath = "C:\222", "D:\111"
$files = Get-ChildItem -Path $folderspath -Recurse | Where-Object { !$_.PSIsContainer }
$md5s = $files | ForEach-Object { Get-FileHash $_.FullName | Select-Object -ExpandProperty Hash }
$groups = $files | Group-Object -Property @{ Expression={$md5s[$files.IndexOf($_)]} } | Where-Object { $_.Count -gt 1 }
foreach ($group in $groups) {
    Write-Output "以下是 MD5 值为 $($group.Name) 的文件:"
    foreach ($item in $group.Group) {
        Write-Output $item.FullName
    }
    Write-Output "---------------------------------------------------------------`n"
}

这段代码首先使用 Get-ChildItem 获取指定路径下的所有文件,再用 Get-FileHash 计算每个文件的 MD5 值,并保存到 $md5s 变量中。

接着,使用 Group-Object 按照 MD5 值分组,并筛选出组内文件数大于1的组。最后,使用 foreach 循环每个组,输出该组中的文件完整路径和文件名,并在每两个组之间输出空行。

输出效果:

以下是 MD5 值为 23C2732778B8A5BFAD00AEA036D8F614430822C40E69A511E1E7AA5F4535B753 的文件:
C:\222\1.docx
D:\111\1.docx
---------------------------------------------------------------

以下是 MD5 值为 E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 的文件:
C:\222\1.pptx
C:\222\1.txt
D:\111\1.pptx
D:\111\1.txt
D:\111\新建文件夹\1.pptx
D:\111\新建文件夹\新建文件夹 (2)\1.docx
---------------------------------------------------------------

可以看出,文件按照MD5值被查找出相同文件。

笔者实验发现,由同一文件复制出的文件,他们之间的MD5值是相同的,会被认为是重复文件。而如果复制出的文件被修改,其MD5值改变,不再被认为是重复文件。

另外,空文件的MD5值相同,如上例中最后的六个文件,都是空文件,被认为是重复文件。

MD5(Message Digest Algorithm 5)是一种常用的单向散列函数,也被称为消息摘要算法。它将任意长度的“消息”(例如文件内容或数据流)计算为固定长度的数字指纹,通常是128位(16个字节)的二进制数。

MD5 算法广泛应用于可验证数据完整性和加密签名等领域。常见的应用包括密码学、数字证书、文件校验和、安全传输等。通过比较两个文件的 MD5 值,可以判断它们的内容是否完全一致,如果不同则说明文件已被篡改或损坏。

需要注意的是,由于 MD5 算法存在碰撞(collision)漏洞,即可以构造出两个不同的消息,它们的 MD5 值却相同。因此,随着计算能力的提升,MD5 算法已经逐渐被更安全的算法所替代,如SHA-256、SHA-3等。

空文件的 MD5 值和非空文件不同。MD5 算法是通过将文件内容作为输入,并生成一个 128 位的散列值作为输出的一种算法。因此,文件大小、文件类型以及文件名等不同的因素都会影响 MD5 值的计算结果。

但是,对于多个空文件来说,它们的 MD5 值是相等的。这是因为空文件的内容都是相同的,都是一个字节都没有。因此,它们的 MD5 计算结果也都是相同的。

将结果写入文件中

结果太长一次看不完,可以保存在文本文件中以后再看。

保存方法是使用“$output”保存。

$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$folderspath = "C:\222", "D:\111"
$files = Get-ChildItem -Path $folderspath -Recurse  | Group-Object -Property Length,Name | Where-Object { $_.Count -gt 1 }
foreach ($file in $files) {
    $output = "Duplicate file name: $($file.Name)`r`n"
    foreach ($item in $file.Group) {
        $output += "`tPath+File Name: $($item.FullName)`r`n"
    }
    $output += ('-'*80) + "`r`n"
    $output | Out-File -FilePath .\11.txt -Append -Encoding UTF8
}

输出结果保存在.\11.txt中,文件内容:

Duplicate file name: 12175, 1.docx
    Path+File Name: C:\222\1.docx
    Path+File Name: D:\111\1.docx
--------------------------------------------------------------------------------

Duplicate file name: 0, 1.pptx
    Path+File Name: C:\222\1.pptx
    Path+File Name: D:\111\1.pptx
    Path+File Name: D:\111\新建文件夹\1.pptx
--------------------------------------------------------------------------------

先构建变量$output,再将$output输出到文件中。

代码解释(不重要,建议跳过)

GPT给出的相关代码解释:

好的,下面是每个参数的含义:

```powershell
$files = Get-ChildItem -Path "C:\your\folder" -Recurse | Where-Object { !$_.PSIsContainer }
```

- `Get-ChildItem`:获取指定目录中的文件和子目录的列表。
- `-Path "C:\your\folder"`:指定要搜索的文件夹路径。可以在引号中替换为您想要搜索的文件夹的完整路径。
- `-Recurse`:递归地返回文件夹层次结构中的所有文件和文件夹。
- `Where-Object { !$_.PSIsContainer }`:使用条件筛选出不是文件夹的对象。您可以将其视为一个过滤器,只返回不是文件夹的项目。

```powershell
$md5s = $files | ForEach-Object { Get-FileHash $_.FullName | Select-Object -ExpandProperty Hash }
```

- `$files`:之前从文件夹中筛选出的所有文件对象的列表。
- `ForEach-Object`:对于 `$files` 列表中的每个元素,执行后续操作。
- `Get-FileHash`:计算指定文件的哈希值。在这里,我们使用 MD5 哈希算法来计算每个文件的哈希值。
- `Select-Object`:选择通过管道传递的对象的属性或其他数据。在这里,我们只需要哈希值。
- `-ExpandProperty Hash`:展开哈希值属性,方便后面的分组使用。

```powershell
$files | Group-Object -Property @{ Expression={$md5s[$files.IndexOf($_)]} } | Where-Object { $_.Count -gt 1 }
```

- `$files`:之前从文件夹中筛选出的所有文件对象的列表。
- `Group-Object`:按照指定属性值对输入对象进行分组。
- `-Property @{ Expression={$md5s[$files.IndexOf($_)]} }`:指定用于分组的属性名称。表达式 `@{ Expression={$md5s[$files.IndexOf($_)]} }` 将对 `$files` 列表中每个元素执行索引计算,以获取它的哈希值。
- `Where-Object { $_.Count -gt 1 }`:筛选出重复文件的分组。只有元素数量大于1的分组才会被保留。

```powershell
foreach ($group in $groups) {
    $group.Group | Select-Object FullName, Length, CreationTime | Sort-Object FullName | Format-Table -AutoSize
}
```

- `foreach`:对于 `$groups` 列表中的每个元素,执行后续操作。
- `$group`:当前循环迭代中的分组对象。
- `$group.Group`:当前循环迭代中分组对象中的重复文件列表。
- `Select-Object FullName, Length, CreationTime`:选择要输出到控制台的文件属性。在这里,我们选择输出文件的完整路径、大小和创建时间。
- `Sort-Object FullName`:按照文件名的字母顺序对输出结果进行排序。
- `Format-Table -AutoSize`:格式化输出结果并自动调整列宽至合适的大小。

`Where-Object { !$_.PSIsContainer }` 是一个 PowerShell 中管道符 `|` 后的过滤器,用于从输出结果中筛选出不是目录(文件夹)的项。

在此处,`Get-ChildItem -Path "D:\111" -Recurse` 命令用于获取指定路径下的所有子项,包括文件和文件夹。使用 `Where-Object` 过滤器可以对子项进行筛选,其中 `$_.PSIsContainer` 是一个布尔值属性,如果为 `$true`,则表示该项是一个目录,反之则为文件。因此,`!$_.PSIsContainer` 表达式的含义是取反后为 `$true` 的项即为非目录(文件)项,即只保留文件类型的子项。

这样做的目的是使得 `$files` 变量只包含指定目录下的文件信息,方便后续计算 MD5 值并按照值进行分组。

希望这样可以让您更好地理解代码!

报错

powershell运行指令,常出现的报错及处理参见:

Windows系统powershell运行指令常见报错及处理_weixin_56337147的博客-CSDN博客 

总结 

powershell终端直接输入指令的方法适合一行指令,操作较简单。编写、执行.ps1文件的方法可以实现复杂效果,但是二者代码意义相同。各代码的意义如下:

Get-ChildItem -Path $folderspath -Recurse:获取$folderspath路径内的的文件,-Recurse参数用来递归地返回文件夹层次结构中的所有文件和文件夹。

Where-Object { !$_.PSIsContainer }:筛选出不是文件夹的项目。有这个步骤的是查找重复文件,没有这个步骤的话既查找重复文件,又查找重复文件夹。

 Group-Object -Property Name:将获取的文件按照“Name”分组,分组标准“Name”可以替换为其他,比如按照名称、长度、拓展名分组可以设置为“Length, Name, Extension",这种分组查重效果比较好。

Where-Object { $_.Count -gt 1 }:筛选出重复文件的分组。“ $_.Count -gt 1”表示只有元素数量大于1的分组才会被保留。“gt”表示“大于”。如果想要重复文件数量大于2的分组就设置成“ $_.Count -gt 2”。

foreach ($file in $files) {:对于 `$files` 列表中的每个元素,执行后续操作。

$output | Out-File -FilePath .\11.txt -Append -Encoding UTF8 :Out-File输出文件,将前面构建好的变量“$output ”输出,“ -FilePath .\11.txt ”文件路径是.\11.txt,保存方式是“-Append”追加保存,文本格式是“ -Encoding UTF8”。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
系统用久了多少会出现一些重复的文档,这个时候如果您的硬盘容量较少,可以考虑使用 使用 重复文件查找删除工具 Easy Duplicate Finder 中文版来删除一些重复的文档以节省更多空间。Easy Duplicate Finder 在几秒钟内查找和删除重复文件!使用此工具,您可以恢复千兆字节的空间,提高计算机速度并整理文件。使用 PC 或 Mac 上的 Easy Duplicate Finder 管理重复文件非常快速,轻松而有趣。 重复文件查找删除工具 Easy Duplicate Finder 中文版重复文件查找删除工具 Easy Duplicate Finder 中文版 立即查找重复文件! Easy Duplicate Finder™ 具有强大的功能,可以帮助您查找和删除重复的照片,文档,MP3,视频,电子邮件等。它出奇的快速,准确且使用起来很轻松。只需将文件夹拖放到程序窗口中并开始扫描即可。 Easy Duplicate Finder™ 将完成其余工作,并从您的 PC 或 Mac 中删除烦人的重复项。而且,如果您误删除了文件,则始终可以使用“撤消”按钮来还原它。 Easy Duplicate Finder 主要特点: -在您的PC或Mac上查找真实的副本 -许多高级搜索方法和自定义扫描模式 -管理重复的文档,歌曲,照片,视频和电子邮件 -超快速搜索和 100% 的准确性 -预览所有类型的文件以更安全地搜索 -撤消按钮,用于紧急恢复 -从 iTunes,照片,iPhoto 和 Windows Media Player 删除重复文件 -从 Google 云端硬盘和Dropbox查找和删除重复项 -向导和助手,可轻松管理重复文件 -保护系统文件文件夹免遭意外删除 Easy Duplicate Finder™ 是查找和删除重复的照片,文档,MP3,视频等的强大工具。它使删除重复文件变得轻松而有趣。只需将文件夹拖放到程序窗口中并开始扫描即可。 Easy Duplicate Finder™ 将完成剩下的工作,并使您的 PC 或Mac免受烦人的重复。它出奇的快速,准确且使用起来很轻松。
### 回答1: C盘user文件夹过大可能有以下几个原因: 1. 用户文件过多:用户可能在C盘user文件夹中存储了大量的文件,如文档、图片、音乐、视频等。这些文件会占用大量的存储空间,导致文件夹变得过大。 2. 软件安装目录:一些软件默认安装在C盘,而且在用户的个人文件夹中会生成一些配置文件或日志文件。随着软件数量的增加和使用时间的延长,这些文件也会增加,从而导致C盘user文件夹的大小增加。 3. 缓存文件:许多应用程序会在C盘user文件夹中存储临时文件、缓存文件等,以方便下次快速访问。这些文件在长时间的使用过程中会逐渐增加,从而增加了C盘user文件夹的大小。 为了解决C盘user文件夹过大的问题,可以采取以下几种方式: 1. 清理不需要的文件:可以定期删除C盘user文件夹中不再需要的文件,如无用的文档、重复的图片和视频等。可以使用系统自带的磁盘清理工具或第三方工具进行清理。 2. 修改默认安装路径:可以将软件的默认安装路径修改为其他磁盘,避免过多的软件文件存储在C盘user文件夹中。 3. 清理缓存文件:可以定期清理应用程序生成的临时文件、缓存文件等,可以通过应用程序的设置界面或者通过第三方工具进行清理。 4. 增加存储空间:如果C盘user文件夹确实需要大量的存储空间,可以考虑在电脑上增加额外的硬盘或固态硬盘,将一部分文件迁移到其他磁盘上,从而减小C盘user文件夹的大小。 ### 回答2: C盘中的User文件夹过大可能是由于以下几个原因造成的: 首先,User文件夹系统默认存储用户文件和设置的位置,包括用户文档、下载、图片、音乐等等。如果用户在C盘中保存了大量的个人文件,该文件夹的大小就会逐渐增大。 其次,Windows系统会自动创建用户配置文件,这些文件用于保存用户的个人设置和应用程序配置信息。这些配置文件会占用一定的存储空间,随着时间的流逝,这些文件可能会逐渐增大。 另外,某些应用程序也会将一些缓存文件、日志文件等保存在User文件夹中,这些文件也会占用一定的空间。 要解决C盘User文件夹过大的问题,可以采取以下几种方法: 首先,可以清理User文件夹中的不必要文件。可以检查用户文档、下载、图片等文件夹,删除不再需要的文件。另外,可以清理临时文件夹和回收站中的文件,释放存储空间。 其次,可以调整一些应用程序的设置,将其缓存文件和日志文件保存到其他分区或者外部存储设备中,以减少User文件夹的大小。 此外,还可以将一些大型文件如视频、音乐等移到其他分区或者外部存储设备中,以减轻C盘负担。 最后,定期进行磁盘清理和优化。使用Windows自带的磁盘清理工具,可以删除系统临时文件、下载缓存等。此外,还可以使用优化软件对C盘进行整理和优化,释放更多的存储空间。 总之,通过清理不必要文件、调整应用程序设置和定期进行磁盘清理,可以有效减小C盘User文件夹的大小,提升系统的性能和稳定性。 ### 回答3: C盘User文件夹过大可能是由于以下原因所致: 1. 缓存文件:用户在使用计算机时,许多应用程序会自动创建缓存文件,用于存储临时数据和待处理的文件。这些缓存文件可能会占用大量的存储空间,并且在长时间的使用后可能无法及时清理。 2. 下载文件:用户在下载文件时,这些文件通常会存储在默认下载文件夹中(如User文件夹)。如果用户长时间不清理下载文件夹,其中的文件会不断累积,并且占据大量的存储空间。 3. 用户文件:用户在日常使用计算机时,可能在User文件夹中存储了大量个人文件,如文档、音频、视频等。随着时间的推移,这些文件可能会不断增加,并且占据大量的存储空间。 针对这个问题,我们可以采取以下措施来解决: 1. 清理缓存文件:用户可以定期清理各种应用程序的缓存文件,以释放存储空间。可以在每个应用程序的设置中找到清理缓存的选项,或者使用系统清理工具进行整体清理。 2. 清理下载文件夹:用户可以定期清理下载文件夹中不再需要的文件,特别是那些已经成功下载并使用过的文件。 3. 整理用户文件:用户可以对User文件夹中的个人文件进行整理和分类。删除不再需要的文件,将文件分类储存在不同的文件夹中,以便后续查找和管理。 4. 移动存储位置:对于特别占用存储空间的文件,可以将它们移动到外部硬盘或其他存储介质中,以释放C盘的空间。 总之,通过定期清理缓存文件、下载文件夹和整理用户文件,以及将一些大文件移动到其他存储介质中,可以解决C盘User文件夹过大的问题,释放更多的存储空间用于其他用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值