Retrouver un sous-dossier avec Powershell
TL;DR Get-ChildItem -Recurse
permet de retrouver récursivement le chemin vers un fichier
ou un répertoire dans Powershell. On peut l’associer à
d’autres commandes afin d’exécuter des traitements sur
le résultat de la recherche.
La commande suivante permet de retrouver rapidement les sous-répertoires du répertoire courant dont le nom commence par “source” :
Get-ChildItem -Recurse -Directory -Filter source*
-Recurse
permet d’effectuer une recherche récursivement sur les sous-dossiers,
-Directory
indique qu’on souhaite ne chercher que des répertoires
et -Filter <pattern>
permet de filtrer les résultats à l’aide d’une
chaine de caractères.
Une fois qu’on a retrouvé le ou les répertoires, un pipe |
suivi
de ForEach-Object
permet de réaliser un traitement sur tous
les résultats. Par exemple pour afficher le chemin complet
de chaque résultat :
Get-ChildItem -Recurse -Directory -Filter source* | ForEach-Object { Write-Host $_.FullName }
La combinaison que j’utilise souvent permet de trouver le premier sous-répertoire avec le nom donné et de s’y déplacer :
Get-ChildItem -Recurse -Directory -Filter source* | ForEach-Object { Set-Location $_.FullName; break }
L’instruction break
est importante, elle permet d’arrêter la recherche
après le premier résultat, ce qui est une optimisation intéressante
dans mon cas.
En version compacte :
gci -Recurse -Directory -Filter source* | % { cd $_.FullName; break }
Autre exemple, trouver le premier fichier *.html
et de l’ouvrir avec
l’application associée :
Get-ChildItem -Recurse -File -Filter *.html | ForEach-Object { Start-Process $_; break }
Pour réutiliser ces commandes ultérieurement, un raccourci peut être ajouté dans le profil Powershell. Pour éditer son profil (par exemple avec VS Code) :
code $PROFILE
Pour ajouter dans le fichier une fonction personnalisée:
function Find-And-Set-Location
{
Param($folder)
Get-ChildItem -Recurse -Directory -Filter $folder | ForEach-Object { Set-Location $_.FullName; break }
}
Et enfin définir un alias vers cette fonction, plus simple à saisir:
New-Alias ccd Find-And-Set-Location