Kurze Antwort
Um die Namen der PDF-Dateien anzuzeigen, die direkt oder indirekt in einem direkten oder indirekten Unterverzeichnis von d:\root
named enthalten sind purchases
, können Sie Folgendes verwenden:
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName
Kurze Erklärung: Der Befehl sucht rekursiv alle direkten und indirekten Unterverzeichnisse von d:\root
named purchases
, dann rekursiv alle PDF-Dateien in jedem dieser Unterverzeichnisse und gibt dann den vollständigen Pfad jeder dieser PDF-Dateien zurück.
Andere Anwendungsfälle
So entfernen Sie diese PDF-Dateien:
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | ri
Um diese PDF-Dateien umzubenennen (z. B. indem Sie dem Basisnamen ein Präfix und ein Suffix hinzufügen):
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % { rni $_ "pref-$($_.BaseName)-suff.pdf" }
So entfernen Sie die purchases
Verzeichnisse mit ihrem gesamten Inhalt:
gci -Directory -Recurse d:\root\purchases | ri -Recurse
Ausführliche Erklärung
gci
ist ein Alias für Get-ChildItem .gci -Directory -Recurse d:\root\purchases
gibt alle Verzeichnisse (-Directory
) zurück, deren Namepurchases
direkte oder indirekte (-Recurse
) Unterordner von istd:\root\
. Mit anderen Worten, es würde zurückkehrend:\root\purchases
(falls vorhanden) sowied:\root\b\c\purchases
undd:\root\a\purchases
. Dies ist nicht sehr intuitiv und scheint in der Dokumentation nicht erklärt zu werden, aber es ist das aktuelle Verhalten (ab PowerShell 6).%
ist ein Alias für ForEach-Object . Es führt einen Skriptblock (in geschweiften Klammern ({}
) eingeschlossen ) für jedes Objekt in der Pipeline aus.gci -Recurse "$_\*.pdf"
Ruft die Liste der PDF-Dateien ab, die (direkt oder indirekt) in den zuvor gefundenenpurchases
Verzeichnissen enthalten sind.% FullName
wird nur verwendet, um den Pfad dieser PDF-Dateien anzuzeigen.ri
ist ein Alias für Remove-Item . Die zuvor berechnete Liste der PDF-Dateien wird entfernt (da der-Path
Parameter desRemove-Item
Befehls Pipeline-Eingaben akzeptiert).ri -Recurse
ermöglicht das Entfernen der zuvor berechneten Verzeichnissepurchases
mit ihrem Inhalt.rni $_ "pref-$($_.BaseName)-suff.pdf"
fügt dem Basisnamen der aktuellen Datei in der Pipeline ein Präfix (pref-
) und ein Suffix (-suff
) hinzu$_.BaseName
(dh jede der PDF-Dateien, nach denen wir suchen). Der Basisname einer Datei ist der Name der Datei ohne Erweiterung undrni
ist ein Alias für Rename-Item .
Testen dieser Lösung (online oder lokal)
Am einfachsten ist es , diese Lösung online auszuprobieren .
Andernfalls können Sie eine Beispielverzeichnisstruktur in einem test
Ordner des aktuellen Arbeitsverzeichnisses mit dem folgenden Snippet erstellen ( Vorsicht : Wechseln .\test
Sie in einen anderen test
Ordner, wenn sich im aktuellen Verzeichnis bereits ein Ordner befindet):
mkdir -ErrorAction SilentlyContinue .\test\a\purchases, .\test\a\e\, .\test\b\c\purchases\ Out-File .\test\a\purchases\invoice1.pdf Out-File .\test\a\order1.pdf Out-File .\test\a\e\order2.pdf Out-File .\test\b\c\purchases\invoice2.pdf Out-File .\test\b\c\purchases\invoice3.pdf
Um alle Dateien in dieser Verzeichnisstruktur anzuzeigen, können Sie Folgendes verwenden:
gci -Recurse -File .\test | % FullName
Was würde so etwas zurückgeben:
D:\test\a\order1.pdf D:\test\a\e\order2.pdf D:\test\a\purchases\prefix-invoice1-suffix.pdf D:\test\b\c\purchases\prefix-invoice2-suffix.pdf D:\test\b\c\purchases\prefix-invoice3-suffix.pdf
(Wo D:
wird durch Ihr aktuelles Arbeitsverzeichnis ersetzt.)
Wenn Sie den als Antwort ( gci -Directory -Recurse .\test\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName
) bereitgestellten Befehl ausführen, werden die Dateien angezeigt, die entfernt oder gelöscht werden müssen:
D:\test\a\purchases\invoice1.pdf D:\test\b\c\purchases\invoice2.pdf D:\test\b\c\purchases\invoice3.pdf
Nach dem Test aufräumen:
rm -Recurse .\test