PowerShell:重复文件,排除文件夹,如果名称/大小相同则删除

时间:2015-12-16 12:50:10

标签: powershell recursion path duplicates

我是PowerShell的新手,我搜索了很多并将我的结果合并到此,但首先,我的文件夹结构是这样的:

  • 测试-neu基因
    • _bewertet
      • 的1.txt
      • 2.txt
    • 1
      • 的1.txt
      • 2.txt
    • 2
      • 的1.txt
      • 3.txt
      • 4.txt
    • ...

我的目标是查找存储在 _bewertet 中的所有文件,如果这些文件也存在于除自身以外的任何其他子文件夹中(关于,文件名和大小),则应将其删除。所以要明确的是,这些文件应该保留在 _bewertet 中,而不是其他地方。

$ignore = @("*_bewertet*");
$one = Get-ChildItem -Recurse -path C:\Users\name\Desktop\test-neu\_bewertet
$two = Get-ChildItem -Recurse -path C:\Users\name\Desktop\test-neu -Exclude $ignore | ? { $_.PSIsContainer }

$matches = (Compare-Object -ReferenceObject $one -DifferenceObject $two -Property Name,Length -ExcludeDifferent -IncludeEqual)

foreach ($file in $matches)
{
    Remove-Item C:\Users\name\Desktop\test-neu\$($file.Name)
}

到目前为止,如果我运行我的脚本,它实际上什么也没做......我的猜测是,需要调整Remove-Item部分。该路径仅转到 C:\ Users \ name \ Desktop \ test-neu \ 1.txt ,因此缺少相应的子文件夹。

如果你们能帮助我,那对我来说意味着很多。欢迎任何建议。祝你今天愉快。 :)

1 个答案:

答案 0 :(得分:0)

这是我能想到的最简单的逻辑,以实现这个目标

$keep = Dir -Path t:\bewertet -Recurse
$allFiles = Dir -Path t:\ -Recurse -Include *.txt | Where Directory -NotLike "t:\bewertet*"
$allFiles | Where Name -in $keep.Name | Remove-Item

$Keep定义bewertet文件夹中的文件列表 $allFiles递归地定义所有文件的列表,仅指定.txt文件,目录不是t:\ bewertet。

最后,我们过滤$allFiles,找到与$keep中的文件匹配的名称的文件,然后删除其中的每个文件。

更好

OP回来说We forgot to check if it's the same size!,因为我在圣诞精神中,我写了这个懒惰的比较。

$keep = gci t:\bewertet -Recurse

$allFiles = dir -Path t:\ -Recurse -Include *.txt | Where Directory -NotLike "t:\bewertet*"

$matches = $allFiles | ? Name -in $keep.Name 

ForEach ($match in $matches){
    $source = $keep | ? Name -eq $match.Name
    $Samefile = ($source.Length -eq $match.length)
    "Does file size match? [$Samefile]"

        if ($Samefile){
            "deleting..."
            Remove-item $match
            }
}