我想删除起始目录下不包含任何大于5MB的文件的所有目录。
我的第一个想法是在一个命令中删除少于5MB的所有文件,然后删除所有空目录,但这不起作用。如果目录包含大于5MB的文件,我想保留目录中的所有文件而不删除目录。
理想情况下,直接位于起始点下的文件夹永远不会被删除,即使它们是空的(下例中的John和Michael)。
以c:\Media
为出发点:
c:\Media\
John\ --this directory should not be deleted because Dir 3 remains
Directory 1\ --this directory and all its files should be deleted
small-file.1.txt [2kb]
small-file.2.txt [7kb]
Directory 2\ --this directory and everything below should be deleted
Subdirectory 1\
small-file-3.txt [1kb]
Directory 3\ --this directory should NOT be deleted
large-file-1.txt [6mb] -- should not be deleted
small-file-4.txt [8kb] -- should not be deleted
Michael\
Directory 4\ -- should be deleted
small-file-5.txt [12kb]
small-file-2.txt [12kb]
PowerShell脚本运行后,我希望目录结构如下所示:
c:\Media\
John\
Directory 3\
large-file-1.txt [6mb] -- should not be deleted
small-file-4.txt [8kb] -- should not be deleted
Michael\
如果Michael
文件夹最终被删除,则不会是世界末日。
答案 0 :(得分:2)
我认为Cole9350有一个正确的想法,即找到超过5mb的文件并排除这些文件夹被删除。此外,您还可以保存根文件夹。我不相信文件系统-Exclude
的功能,所以我建议将其移到Where子句中。另外,要检查文件夹是否包含具有5MB文件的行的文件夹,那么,我唯一可以理解的方法是在每个文件夹上运行目录列表并检查其中是否包含任何列入白名单的文件夹,这就是我在剧本中所做的。
所以这应该排除John和Michael文件夹,以及其中包含5MB文件的任何文件夹,或者包含在链中某处有5MB文件夹的文件夹。有点慢,因为它有很多递归,但是彻底,应该是安全的。
#Find folders with files > 5MB
$Exclude = gci C:\Media -recurse | ?{$_.Length -gt 5mb} | Select -ExpandProperty PSParentPath -Unique
$folders = gci C:\Media -Directory -Recurse|%{if((gci $_ -Directory -Recurse)){if(!(compare-object (gci $_ -Directory -Recurse|select -ExpandProperty pspath) $Exclude -ExcludeDifferent -IncludeEqual)){$_}}}|select -ExpandProperty FullName
#Add root folders
$ExcludeRoot += GCI C:\Media -Directory | Select -Expand FullName
$folders | ?{$ExcludeRoot -notcontains $_.FullName} | Remove-Item $_ -Recurse -WhatIf
现在,您只询问了目录,而不是文件。所以如果你有:
C:\ Media \ John \ Subfolder1 \ SubfolderA \ ET.mp4< 1,254,132,001 bytes>
您想要保留SubfolderA,但是您是否也希望将文件保留在Subfolder1中?我的脚本会将文件保存在两个文件中,因为它只删除文件夹而不是特定文件。
答案 1 :(得分:1)
根据您的要求,似乎更容易尝试查找大于5mb的文件,并且只保留这些文件夹:
#declare array
$arr = @()
#Find all Files greater than 5 mb, add the parent folder to the array
ls -Recurse | ? {$_.length -gt 5mb -and !$_.PSIsContainer} | % { $arr += $_.PSParentPath }
#Remove the folders, excluding the ones with files > 5mb
ls -recurse -Exclude $arr | Remove-item -recurse -WhatIf