如何删除过时的文件?
How to delete outdated files?
我有一个包含几千个文件的文件夹。每个文件都已更新多次,有的比其他的多。每个更新版本都会根据修订获得一个新编号。例如,文件 "Apple.pdf" 已更新 3 次,现在名称为 "Apple3.pdf"
有什么方法可以批量删除所有有更新版本的文件而不影响没有更新版本的文件?例如,在更新 2 中,我收到 20 个名为“???2.pdf”的文件,而现在在更新 3 中,我只有 10 个名为“???3.pdf”的更新文件。我需要从更新 2 中删除过时的文件,同时保留不受更新 3 影响的文件。
提前感谢您的任何建议!
$Path = "C:\testData"
Get-ChildItem $Path -Include *2.pdf -Recurse |
ForEach-Object ($_){Remove-Item $_.FullName}
删除 C:\testData 中全名末尾带有 2.pdf 的所有文件,并递归检查子文件夹以执行相同操作。
我编写了一个快速的小脚本来搜索目录,在本例中为 'C:\temp\test',并在文件名中找到具有不同版本号的类似名称的项目。然后它按降序对结果进行排序并删除除第一个结果之外的所有结果。我对其进行了测试,它按预期工作:
编辑:按照 LotPings 的建议,我更改了 $search 的值以仅查找尾随数字,但我还添加了 $_.extension 以确保它与相同的文件格式进行比较.我还更新了示例,因为它已经改变了。感谢推荐!
$dir = "C:\temp\test"
$contents = gci $dir
$contents | % {
$search = ($_.BaseName -replace "[0-9]*$","")+$_.Extension
$search | % {
$targets = gci $dir | ? {$_.Name -like "$(($search).Split(".")[0])*"} | sort -Descending
$count = $targets.count
$targets[1..($count-1)] | % {
Remove-Item $_.FullName -Force
}
}
}
比如原来是这个样子的目录
PS C:\Users\stack> gci c:\temp\test
Directory: C:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/2/2017 7:33 AM bak
-a---- 3/1/2017 8:19 AM 0 2Two1.txt
-a---- 3/1/2017 8:19 AM 0 2Two2.txt
-a---- 3/1/2017 8:19 AM 0 Four1.txt
-a---- 3/1/2017 8:19 AM 0 Four2.txt
-a---- 3/1/2017 8:19 AM 0 Four3.txt
-a---- 3/1/2017 8:19 AM 0 Four4.txt
-a---- 3/1/2017 8:19 AM 0 One1.txt
-a---- 3/1/2017 8:19 AM 0 Three1.txt
-a---- 3/1/2017 8:19 AM 0 Three2.txt
-a---- 3/1/2017 8:19 AM 0 Three3.txt
-a---- 3/1/2017 8:19 AM 0 Twenty20.txt
-a---- 3/1/2017 8:19 AM 0 Twenty21.txt
-a---- 3/1/2017 8:19 AM 0 Two1.txt
-a---- 3/1/2017 8:19 AM 0 Two2.txt
最终看起来像这样:
PS C:\Users\stack> gci c:\temp\test
Directory: C:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/2/2017 7:33 AM bak
-a---- 3/1/2017 8:19 AM 0 2Two2.txt
-a---- 3/1/2017 8:19 AM 0 Four4.txt
-a---- 3/1/2017 8:19 AM 0 One1.txt
-a---- 3/1/2017 8:19 AM 0 Three3.txt
-a---- 3/1/2017 8:19 AM 0 Twenty21.txt
-a---- 3/1/2017 8:19 AM 0 Two2.txt
我有一个包含几千个文件的文件夹。每个文件都已更新多次,有的比其他的多。每个更新版本都会根据修订获得一个新编号。例如,文件 "Apple.pdf" 已更新 3 次,现在名称为 "Apple3.pdf"
有什么方法可以批量删除所有有更新版本的文件而不影响没有更新版本的文件?例如,在更新 2 中,我收到 20 个名为“???2.pdf”的文件,而现在在更新 3 中,我只有 10 个名为“???3.pdf”的更新文件。我需要从更新 2 中删除过时的文件,同时保留不受更新 3 影响的文件。
提前感谢您的任何建议!
$Path = "C:\testData"
Get-ChildItem $Path -Include *2.pdf -Recurse |
ForEach-Object ($_){Remove-Item $_.FullName}
删除 C:\testData 中全名末尾带有 2.pdf 的所有文件,并递归检查子文件夹以执行相同操作。
我编写了一个快速的小脚本来搜索目录,在本例中为 'C:\temp\test',并在文件名中找到具有不同版本号的类似名称的项目。然后它按降序对结果进行排序并删除除第一个结果之外的所有结果。我对其进行了测试,它按预期工作:
编辑:按照 LotPings 的建议,我更改了 $search 的值以仅查找尾随数字,但我还添加了 $_.extension 以确保它与相同的文件格式进行比较.我还更新了示例,因为它已经改变了。感谢推荐!
$dir = "C:\temp\test"
$contents = gci $dir
$contents | % {
$search = ($_.BaseName -replace "[0-9]*$","")+$_.Extension
$search | % {
$targets = gci $dir | ? {$_.Name -like "$(($search).Split(".")[0])*"} | sort -Descending
$count = $targets.count
$targets[1..($count-1)] | % {
Remove-Item $_.FullName -Force
}
}
}
比如原来是这个样子的目录
PS C:\Users\stack> gci c:\temp\test
Directory: C:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/2/2017 7:33 AM bak
-a---- 3/1/2017 8:19 AM 0 2Two1.txt
-a---- 3/1/2017 8:19 AM 0 2Two2.txt
-a---- 3/1/2017 8:19 AM 0 Four1.txt
-a---- 3/1/2017 8:19 AM 0 Four2.txt
-a---- 3/1/2017 8:19 AM 0 Four3.txt
-a---- 3/1/2017 8:19 AM 0 Four4.txt
-a---- 3/1/2017 8:19 AM 0 One1.txt
-a---- 3/1/2017 8:19 AM 0 Three1.txt
-a---- 3/1/2017 8:19 AM 0 Three2.txt
-a---- 3/1/2017 8:19 AM 0 Three3.txt
-a---- 3/1/2017 8:19 AM 0 Twenty20.txt
-a---- 3/1/2017 8:19 AM 0 Twenty21.txt
-a---- 3/1/2017 8:19 AM 0 Two1.txt
-a---- 3/1/2017 8:19 AM 0 Two2.txt
最终看起来像这样:
PS C:\Users\stack> gci c:\temp\test
Directory: C:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/2/2017 7:33 AM bak
-a---- 3/1/2017 8:19 AM 0 2Two2.txt
-a---- 3/1/2017 8:19 AM 0 Four4.txt
-a---- 3/1/2017 8:19 AM 0 One1.txt
-a---- 3/1/2017 8:19 AM 0 Three3.txt
-a---- 3/1/2017 8:19 AM 0 Twenty21.txt
-a---- 3/1/2017 8:19 AM 0 Two2.txt