PowerShell로 빈 하위 폴더를 삭제하는 방법은 무엇입니까?
최종 사용자를 위한 "정크 드로어"인 공유가 있습니다.적합하다고 판단되는 대로 폴더와 하위 폴더를 만들 수 있습니다.31일 이상 지난 파일을 삭제하는 스크립트를 구현해야 합니다.
파워셸부터 시작했어요현재 비어 있는 하위 폴더를 삭제하여 파일 삭제 스크립트를 확인해야 합니다.하위 폴더가 중첩되어 있기 때문에 파일이 비어 있지만 하위 폴더 아래에 파일이 들어 있는 하위 폴더는 삭제하지 않아야 합니다.
예:
FILE3a
10일이 지났습니다.FILE3
45일이 지났습니다.- 구조를 정리하여 30일 이상 지난 파일을 제거하고 빈 하위 폴더를 삭제합니다.
C:\Junk\subfolder1a\subfolder2a\FILE3a
C:\Junk\subfolder1a\subfolder2a\subfolder3a
C:\Junk\subfolder1a\subfolder2B\FILE3b
원하는 결과:
- 삭제:
FILE3b
,subfolder2B
&subfolder3a
. - 종료:
subfolder1a
,subfolder2a
,그리고.FILE3a
.
파일을 재귀적으로 정리할 수 있습니다.삭제하지 않고 하위 폴더를 정리하는 방법subfolder1a
("정크" 폴더는 항상 유지됩니다.)
이전 파일을 먼저 삭제한 다음 빈 dirs를 삭제하는 두 가지 경로로 이 작업을 수행합니다.
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
이 작업 유형은 두 번째 명령 집합에서 보여주는 PowerShell의 중첩된 파이프라인의 성능을 시연합니다.중첩된 파이프라인을 사용하여 디렉터리에 파일이 0개 있는지 여부를 재귀적으로 확인합니다.
첫 번째 답변에서 빈 디렉토리를 삭제하는 가장 빠른 방법은 다음과 같습니다.
ls -recurse | where {!@(ls -force $_.fullname)} | rm -whatif
디렉토리에 .svn과 같은 숨겨진 폴더가 있는 경우 -force 플래그가 필요합니다.
이렇게 하면 상위 디렉터리가 빈 중첩 디렉터리 문제를 해결하기 전에 하위 디렉터리가 정렬됩니다.
dir -Directory -Recurse |
%{ $_.FullName} |
sort -Descending |
where { !@(ls -force $_) } |
rm -WhatIf
마지막 항목에 추가:
while (Get-ChildItem $StartingPoint -recurse | where {!@(Get-ChildItem -force $_.fullname)} | Test-Path) {
Get-ChildItem $StartingPoint -recurse | where {!@(Get-ChildItem -force $_.fullname)} | Remove-Item
}
이렇게 하면 $StartingPoint 아래의 빈 폴더를 계속 검색하여 제거할 수 있습니다.
기업 친화적인 기능이 필요했습니다.제가 받을게요.
다른 답변의 코드로 시작한 다음 원본 폴더 목록(폴더당 파일 수 포함)이 있는 JSON 파일을 추가했습니다.빈 디렉토리를 제거하고 로그에 기록합니다.
https://gist.github.com/yzorg/e92c5eb60e97b1d6381b
param (
[switch]$Clear
)
# if you want to reload a previous file list
#$stat = ConvertFrom-Json (gc dir-cleanup-filecount-by-directory.json -join "`n")
if ($Clear) {
$stat = @()
} elseif ($stat.Count -ne 0 -and (-not "$($stat[0].DirPath)".StartsWith($PWD.ProviderPath))) {
Write-Warning "Path changed, clearing cached file list."
Read-Host -Prompt 'Press -Enter-'
$stat = @()
}
$lineCount = 0
if ($stat.Count -eq 0) {
$stat = gci -Recurse -Directory | %{ # -Exclude 'Visual Studio 2013' # test in 'Documents' folder
if (++$lineCount % 100 -eq 0) { Write-Warning "file count $lineCount" }
New-Object psobject -Property @{
DirPath=$_.FullName;
DirPathLength=$_.FullName.Length;
FileCount=($_ | gci -Force -File).Count;
DirCount=($_ | gci -Force -Directory).Count
}
}
$stat | ConvertTo-Json | Out-File dir-cleanup-filecount-by-directory.json -Verbose
}
$delelteListTxt = 'dir-cleanup-emptydirs-{0}-{1}.txt' -f ((date -f s) -replace '[-:]','' -replace 'T','_'),$env:USERNAME
$stat |
? FileCount -eq 0 |
sort -property @{Expression="DirPathLength";Descending=$true}, @{Expression="DirPath";Descending=$false} |
select -ExpandProperty DirPath | #-First 10 |
?{ @(gci $_ -Force).Count -eq 0 } | %{
Remove-Item $_ -Verbose # -WhatIf # uncomment to see the first pass of folders to be cleaned**
$_ | Out-File -Append -Encoding utf8 $delelteListTxt
sleep 0.1
}
# ** - The list you'll see from -WhatIf isn't a complete list because parent folders
# might also qualify after the first level is cleaned. The -WhatIf list will
# show correct breath, which is what I want to see before running the command.
30일 이전의 파일을 제거하려면:
get-childitem -recurse |
? {$_.GetType() -match "FileInfo"} |
?{ $_.LastWriteTime -lt [datetime]::now.adddays(-30) } |
rm -whatif
(그냥 제거하기만 하면 됩니다.-whatif
실제로 수행합니다.)
후속 조치:
get-childitem -recurse |
? {$_.GetType() -match "DirectoryInfo"} |
?{ $_.GetFiles().Count -eq 0 -and $_.GetDirectories().Count -eq 0 } |
rm -whatif
이것은 저에게 효과가 있었습니다.
$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"
이전 파일 삭제$limit
:
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
이전 파일을 삭제한 후 남아 있는 빈 디렉토리를 삭제합니다.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
언급URL : https://stackoverflow.com/questions/1575493/how-to-delete-empty-subfolders-with-powershell
'programing' 카테고리의 다른 글
Tablet 기기에서 탭이 전체 너비를 차지하지 않음 [안드로이드 사용]서포트.디자인.위젯탭 레이아웃] (0) | 2023.08.13 |
---|---|
Jquery 날짜 선택기 z 인덱스 문제 (0) | 2023.08.13 |
라벨 마이그레이션 파일에 열이 있는지 확인 (0) | 2023.08.13 |
"dial unix /var/run/docker"를 수정하는 방법.sock: connect: permission denied" 그룹 권한이 올바른 것처럼 보일 때? (0) | 2023.08.13 |
ASP.net 보다 Classic ASP의 이점이 있습니까? (0) | 2023.08.13 |