Reputation: 5590
This question has actually come up for me a couple of times, and despite searching, I haven't been able to find an answer for it. I'm posting here because I've found a working solution that will hopefully help other users, but I'd also like to know if there is a better way to achieve the same result. When we write
Get-ChildItem -Recurse
We are able to specify a maximum depth, and in that case, Powershell will only search subdirectories until that maximum depth. However, I sometimes want to search to at least a minimum depth. For my own purposes, I really just want to exclude the folder that I am searching in.
For example, if I am in C:/MyFolder
, I want to get files from subfolders of MyFolder
, but I do not want to get any file that is in MyFolder
and not one of its subdirectories. So for the command
Get-ChildItem -Recurse -Filter *.txt
Retrieving the following files would be good
C:\MyFolder\test\hello.txt
C:\MyFolder\abc\cde\goodbye.txt
and these would be bad
C:\MyFolder\yes.txt
C:\MyFolder\no.txt
To solve this issue, I can write:
Get-ChildItem -Recurse -Filter *.txt | Where-Object -FilterScript {$_.Directory.FullName -ne $(Get-Location)}
Which I'm actually quite happy with, but I was wondering if there is a better way to search at a minimum depth, as I am a PowerShell novice. Obviously, we could write a function to handle this depth but I am wondering if any of the more experienced users have a better way of doing this.
Upvotes: 2
Views: 886
Reputation: 439487
You can chain two Get-ChildItem
calls:
Get-ChildItem -Directory | Get-ChildItem -Recurse -Filter *.txt
To generalize the solution, use a wildcard-based path; e.g., for a minimum depth of 3
:
Get-ChildItem */* -Directory | Get-ChildItem -Recurse -Filter *.txt
Upvotes: 5