首页 > 解决方案 > 在几个路径中递归地计算文件,在 Powershell 中排除和消除冗余文件

问题描述

我正在尝试在 Powershell 中创建一组关于如何:

  1. 从几个不相关的文件夹中检索文件并计算它们,但某些文件和/或子文件夹除外

  2. 给我最后修改的文件(最近的)

  3. 根据名称、日期时间和文件大小删除重复文件,而不仅仅是名称(同名但不同的文件可以位于多个文件夹中),因为该文件可能在备份参数中作为冗余文件通配符/文件夹重复,这将意味着同一路径中完全相同的文件可以计算两次或更多,然后破坏我的文件计数。

到目前为止我所做的(浏览器配置文件路径的示例,在我输入之后):

(“箭头”指向各种参数)

       File           File          folder     many JSON inside folder    Folder
        |              |               |                    |              |
        v              v               v                    v              v

GCI bookmarks, 'Current Session', databases\*, extensions\manifest.json, 'Local Storage\*' -Recurse | ? { $_.FullName -inotmatch 'Local Storage\\http* | Databases\\http*'} | Get-Unique | measure-object -line

                                                  ^                       ^
                                                  |                       |
       EXCLUSIONS:           HTTP* files inside folder      HTTP* subfolders inside folder

这已经从我不想要的文件中过滤了我想要的所有文件,计算它们并删除重复项,但是:还删除了不同文件夹中具有相同名称的许多 Json 文件,而不考虑文件大小(尽管我认为它仍然区分日期)

底线我想要的是命令行 RAR 和 7Zip 的功能,以确切知道要在存档中包含什么:我们输入文件和文件夹,我们可能会错误地包含一个已经被以前的通配符覆盖的子文件夹,我们编程例外(-x!在 7zip 的情况下),并且程序确切知道要包含和排除哪些文件,并且无需两次压缩相同的文件

这样我就可以知道是否需要新备份,相对于前一个备份(不同数量的文件,或最近修改的文件)。我知道 rar 和 7zip 上的“更新”功能,但这不是我想要的。说到最近写的文件,有没有某种“平行管道”的方法?递归文件搜索可以将结果输出到链中的 2 个命令,而不是对文件计数进行(长)扫描,然后重复扫描以查找最新文件?

我的意思是:

         **THIS:                                        **Instead of THIS:

          _______ >FILE COUNT
         |
  SCAN --+                                   SCAN -->FILE COUNT ;  SCAN -->MOST RECENT FILE
         |_______ >MOST RECENT FILE

我已经完成了几乎所有的工作,但我碰壁了。我所缺少的是删除冗余文件(例如,由于输入了冗余参数,同一路径中的相同文件被计算两次或更多次,尽管我希望仍然计算不同文件夹中的同名文件);在此期间,我也不介意获取最后修改的文件,因此我不必再次重复相同的扫描(powershell 有时会非常慢)。最后一点不太重要,但如果它有效,那就太好了。

您可以在 htis 上给我的任何帮助将不胜感激。谢谢阅读 :-)

标签: powershellcountduplicates

解决方案


类似的东西

#generate an example list with the exact same files listed more than once, and possibly files by the same name in sub-folders
$lst = ls -file; $lst += ls -file -recurse

$UniqueFiles = ($lst | sort -Property FullName -Unique)      #remove exact dupes
$UniqueFiles = ($UniqueFiles| sort -Property Directory,Name) #make it look like ls again

# or most recent file per filename
$MostRecent = ($lst | sort -Property LastWriteTime -Descending | group -Property Name | %{$_.group[0]})

尽管我不明白文件大小如何发挥作用,除非您正在寻找具有相同大小和名称的文件,无论它位于文件夹树中的哪个位置,都只列出一次。在这种情况下,您可能希望按哈希值分组,因此即使它具有不同的名称,它仍然只会列出一次。

$MostRecentSameSize = ($lst | sort -Property LastWriteTime -Descending | group -Property @{exp='Name'},@{exp='Length'} | %{$_.group[0]})

# or by hash
$MostRecentByHash = ($lst | sort -Property LastWriteTime -Descending | group -Property @{exp={(Get-FileHash $_ -a md5).hash}} | %{$_.group[0]})

推荐阅读