Unterordner suchen, die nur doppelte Dateien enthalten

351
DDriggs00

Ich suche nach einer Methode (ohne kostenpflichtige Software), um alle Ordner zu finden, die nur Dateien enthalten, die sich auch in mindestens einem anderen Unterordner des übergeordneten Verzeichnisses befinden. Bei Verwendung in einer Musikbibliothek würde dies alle Zusammenstellungsalben auflisten.

Dateistruktur:
Künstlerordner
- Albumordner
- - Titel mit Dateiname als Titel

1
Beliebig viele Duplikate? Wie viele schichten tief jdwolf vor 6 Jahren 0
OP @jdwolf aktualisiert DDriggs00 vor 6 Jahren 0

1 Antwort auf die Frage

1
Ben N

Sie können PowerShell verwenden!

$dupes = gi $args[0] | gci -File -Recurse | group Name | ? {$_.Count -gt 1} gi $args[0] | gci -Directory | ? { $allDupes = $true $hasAny = $false $_ | gci -File | % { $folder = $_ $hasAny = $true If (!($dupes | ? {$_.Name -eq $folder.Name})) {$allDupes = $false} } $allDupes -and $hasAny } 

Dieses Skript ist etwas schwierig, also gehen wir es sorgfältig durch. Erstens erhält er den Ordner als Argument angegeben, sucht rekursiv nach den darin enthaltenen Dateien, gruppiert sie nach Dateinamen, nimmt nur die Gruppen mit mehr als einem Element (dh die Gruppen, die duplizierte Songs darstellen) auf und speichert diese Sammlung von Gruppen darin $dupes. Dann erhält es erneut das angegebene übergeordnete Verzeichnis, listet jedoch nur die unmittelbaren Unterordner auf. Sie filtert sie ( ?) und lässt nur diejenigen, die nur doppelte Einträge enthalten, die Pipeline verlassen und auf dem Bildschirm gedruckt werden.

Dieser große Filterblock nimmt den größten Teil des Skripts in Anspruch. Schauen wir uns das genauer an. Es beginnt mit zwei Variablen, einer, um zu verfolgen, ob der aktuelle Albumordner bisher nur Duplikate enthält, und eine andere, um festzustellen, ob tatsächlich Titel im Ordner vorhanden sind. (Ich vermute, es wäre nicht wirklich hilfreich, leere Ordner als Zusammenstellungsalben zu zählen.) Es listet die Dateien im Albumordner auf und stellt dann für jeden von ihnen ( %) sicher, dass es eine doppelte Gruppe gibt, die eine Datei mit demselben Namen enthält und wenn nicht (dh es kommt nichts aus der kurzen Pipeline im Inneren If), zeigt dies den Fehler an, indem es $allDupesauf false gesetzt wird. Wenn der for-each-Block überhaupt nicht lief, dann$hasAnybleibt falsch. Der große Filterblock bewertet schließlich, ob alle Elemente im Album Duplikate sind und tatsächlich vorhanden sind. Das Ergebnis des Ausdrucks bestimmt, ob der Albumordner in der Ausgabe der äußeren Pipeline enthalten ist.

Beachten Sie, dass einige der PowerShell-Funktionen, die in diesem Skript verwendet werden, kürzlich moderat eingeführt wurden. Wenn Sie Windows 7 verwenden, die -Fileund -DirectorySchalter wird nicht funktionieren. Dies kann bei Bedarf umgangen werden.

Um das Skript zu verwenden, speichern Sie es als .ps1Datei, z albumdupes.ps1. Wenn Sie dies noch nicht getan haben, befolgen Sie die Anweisungen im Abschnitt Aktivieren von Skripts des PowerShell-Tag-Wikis . Anschließend können Sie es über eine PowerShell-Eingabeaufforderung in dem Verzeichnis ausführen, in dem Sie es gespeichert haben, und den Pfad zu Ihrem Künstlerordner angeben:

.\albumdupes.ps1 'C:\Users\Ben\Test\albumtest' 

Sie erhalten folgende Ausgabe:

 Directory: C:\Users\Ben\Test\albumtest   Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 11/20/2017 2:00 PM Album C d----- 11/20/2017 2:01 PM Album F