我是 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) }
参考: