Scr*_*her 28 powershell recursion file delete-directory
我有一个分享,是最终用户的"垃圾抽屉".他们可以根据需要创建文件夹和子文件夹.我需要实现一个脚本来删除超过31天创建的文件.
我从Powershell开始.我需要通过删除现在为空的子文件夹来跟进文件删除脚本.由于子文件夹的嵌套,我需要避免删除没有文件的子文件夹,但在其下面有一个包含文件的子文件夹.
例如:
FILE3a
已经10天了. FILE3
是45天.C:\Junk\subfolder1a\subfolder2a\FILE3a
C:\Junk\subfolder1a\subfolder2a\subfolder3a
C:\Junk\subfolder1a\subfolder2B\FILE3b
Run Code Online (Sandbox Code Playgroud)
期望的结果:
FILE3b
,subfolder2B
&subfolder3a
. subfolder1a
,subfolder2a
,和FILE3a
.我可以递归清理文件.如何清除子文件夹而不删除subfolder1a
?("垃圾"文件夹将始终保留.)
Kei*_*ill 43
我会在两次传递中执行此操作 - 首先删除旧文件,然后删除空目录:
Get-ChildItem -recurse | Where {!$_.PSIsContainer -and `
$_.LastWriteTime -lt (get-date).AddDays(-31)} | Remove-Item -whatif
Get-ChildItem -recurse | Where {$_.PSIsContainer -and `
@(Get-ChildItem -Lit $_.Fullname -r | Where {!$_.PSIsContainer}).Length -eq 0} |
Remove-Item -recurse -whatif
Run Code Online (Sandbox Code Playgroud)
这种类型的操作演示了第二组命令演示的PowerShell中嵌套管道的强大功能.它使用嵌套管道以递归方式确定任何目录下是否有零文件.
本着第一个答案的精神,这是删除空目录的最短方法:
ls -recurse | where {!@(ls -force $_.fullname)} | rm -whatif
Run Code Online (Sandbox Code Playgroud)
当目录具有隐藏文件夹(如.svn)时,需要-force标志
这将在解决空嵌套目录问题的父目录之前对子目录进行排序。
dir -Directory -Recurse |
%{ $_.FullName} |
sort -Descending |
where { !@(ls -force $_) } |
rm -WhatIf
Run Code Online (Sandbox Code Playgroud)