powershell - 在几个路径中递归地计算文件,在 Powershell 中排除和消除冗余文件
问题描述
我正在尝试在 Powershell 中创建一组关于如何:
从几个不相关的文件夹中检索文件并计算它们,但某些文件和/或子文件夹除外
给我最后修改的文件(最近的)
根据名称、日期时间和文件大小删除重复文件,而不仅仅是名称(同名但不同的文件可以位于多个文件夹中),因为该文件可能在备份参数中作为冗余文件通配符/文件夹重复,这将意味着同一路径中完全相同的文件可以计算两次或更多,然后破坏我的文件计数。
到目前为止我所做的(浏览器配置文件路径的示例,在我输入之后):
(“箭头”指向各种参数)
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 上给我的任何帮助将不胜感激。谢谢阅读 :-)
解决方案
类似的东西
#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]})
推荐阅读
- javascript - 通过遍历数组来填充表
- asp.net - 为什么 POST 使用“表单”与使用“正文”?
- google-sheets - 与 QUERY 函数发生冲突的 Google 脚本问题
- qt - 如何在没有 OpenGL 的情况下以有效的方式将解码的 YUV420P 格式帧显示到 Qt 中?
- javascript - 如何在除标题之外的文本区域中删除行并显示已删除的行?
- java - Prepared Statement 返回部分记录,即 3,而同一查询的 sql developer 返回所有记录,即 5
- rdlc - 如何在固定高度的 RDLC 单元格中显示尽可能多的文本?
- angular - 是否可以在带有 Bootstrap 的 Angular 项目中使用 Angular Material 进行拖放?
- c# - 如何将科学计数法 double 转换为非科学计数法 double
- node.js - 尝试使用带有 nodejs 运行时的 aws lambda 将图像保存到 aws s3 子文件夹