如何批量选择不符合模式的文件

如何批量选择不符合模式的文件

我是 powershell 和 cmd 的新用户,我需要选择数千个不符合特定模式的文件。模式如下:7num_5num_2num

我正在寻找一种方法来选择这些文件,到目前为止,我发现了一个如下所示的命令:

>> find /home/example -iname "*.txt" -exec grep -Li "mystring" {} \+

此命令查找名称中包含 mystring 的所有文件。但从这里开始,我并不确切知道如何实现索引号,因此我需要指导。

答案1

电源外壳

假设:

  • 单个顶级文件夹(可以修改为搜索多个路径)
  • 顶级文件夹有子文件夹(因此有-Recurse参数)
Get-ChildItem -Path $Source -Filter '*.jpg' -File -Recurse |
  Where-Object BaseName -notMatch '\d{7}_\d{5}_\d{2}' |
Select-Object Name, FullName

使用别名缩写:

gci 'C:\Path\to\Folder' '*.jpg' -af -s | ? BaseName -notMatch '\d{7}_\d{5}_\d{2}' | Select Name, FullName

编辑 - -修改匹配条件

文件类型选择受-Filter参数 的限制Get-ChildItem-Path-Filter参数由文件系统提供程序处理,然后文件返回给电源外壳,因此往往比后续过滤(-Include/ -Exclude)更快。

-match运算-notMatch常用表达,它比仅限于文字的表达式提供更精确的匹配,并且通配符。有一个方便的此处为备忘单

以上返回全部文件匹配指定的路径,即使它们并不接近。

要查找位数少于所需位数的文件名,请切换到-match运算符并使用{min,max}量词表示法,即要匹配“少于 7 位数字”,请使用\d{0,6}。如果文件名中只有一部分可能太短,则表达式将非常接近原始表达式:

  • Where BaseNaem -match '\d{0,6}_\d{5}_\d{2}'

如果你想归档文件 关闭达到所需的模式,但位数少于所需的位数任何部分,指定每个部分的计数范围并检查总长度:

  • Where { (($_.BaseName.Length -lt 16) -and $_.BaseName -match '\d{1,7}_\d{1,5}_{1,2}') }

如果要测试任何部分的数字值,请先测试匹配,添加括号将数字保存到捕获组中,然后使用$Matches自动变量来引用这些组:

  • Where { ($_.BaseName -match '(\d{7})_(\d{5})_(\d{2})') -and ($Matches[2] -gt 10000) }

参考:

相关内容