Doppelte Unterverzeichnisse im Vaterverzeichnis finden

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
darkblaze
Junior Member
Junior Member
Posts: 6
Joined: 2015-03-11, 12:26 UTC

Doppelte Unterverzeichnisse im Vaterverzeichnis finden

Post by *darkblaze »

Hallo alle miteinander!

:D

Ich versuche nun jetzt schon seit Tagen eine bestimmte Funktion zu realisieren:

Ich habe in einem Verzeichnisbaum in den Verzeichnissen (nicht immer mit diesem Namen) ".\Res" oft Verzeichnisse mit dem Namen "Res 13abcd" (abcd sind Ziffern), die am Ende des Jahres 2013 dann in den Ordner ".\Res\Res 13" verschoben wurden.

Durch einen Fehler wurden sie aber im Ordner ".\Res" nicht gelöscht und sind jetzt zu hunderten doppelt vorhanden.

Ich würde das Löschen gerne automatisiert nachholen.

Dh. die gesuchte Funktion wäre:

Finde alle Verzeichnisse mit Namen regexp "Res\2013\d\d\d\d", die ebenfalls in einem Unterordner "Res 13" im Vaterverzeichnis (meist "Res") vorkommen.

Also zB:

Res\Res 13\Res 131102
Res\Res 13\Res 130221
Res\Res 131102 <--- finden und löschen
Res\Res 130221 <--- finden und löschen
Res\Res 131111 <--- nicht löschen

Ist das im TotalCommander möglich? Da einige hundert Verzeichnisse zusammenkommen und dann das ganze nicht nur für 13 sondern auch für 14, 12, 11, 10, 09, ... etc. ebenfalls noch durchgespielt werden müsste, kann ich das unmöglich mit der Hand machen.

Vielen Dank und liebe Grüße,

René
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

PowerShell: Finde doppelte Ordner

Post by *Stefan2 »

Hallo René und willkommen.

Ich würde das mit einem Skript erledigen,... etwa:

Liste von "Res\" erstellen
Liste von "Res 13\" erstellen
IF (exist_in_Res) AND (exist_in_Res13) THEN Delete in Res\



Probier's mal aus:

- Gehe in den Hauptordner "Res"
Res\RES 13\
Res\Res 130221\
Res\Res 131102\
Res\Res 131111\


- öffne eine PowerShell (und stelle sicher, dass du auch wirklich im "Res" Ordner arbeitest)

- kopiere nacheinander diese drei Zeilen und drücke die Enter-Taste

Code: Select all

 [string[]]$ResMain = dir | where{$_.PSisContainer}| %{$_.Name}
 [string[]]$Res13   = dir "Res 13" | where{$_.PSisContainer}| %{$_.Name}
 foreach($Folder in $ResMain){if($Res13.contains($Folder)){"$Folder renamed"; ren -path "$PWD\$Folder" -new ("$PWD\_$Folder")}}
- Ergebnis: Die auch in "Res 13" enthaltenen Ordner sind in "Res" mit einem führendem Unterstrich umbenannt worden (bereit zum manuellem Löschen)
Res\_Res 130221\
Res\_Res 131102\
Res\RES 13\
Res\Res 131111\




Bei Bedarf kannst du das auch als Ein-Klick-Skript haben....



HTH? :D
User avatar
Dalai
Power Member
Power Member
Posts: 9974
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Suchen nach:

Code: Select all

Res 13\d{4}
[X] RegEx

Register Erweitert:
[X] Attribute [X] Verzeichnisse
alle anderen Attribute-Checkboxen unangetastet lassen!

Danach muss man natürlich von Hand prüfen, ob der Gegenpart existiert. Insofern ist die Sache mit einem Skript tatsächlich zuverlässiger zu lösen.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
darkblaze
Junior Member
Junior Member
Posts: 6
Joined: 2015-03-11, 12:26 UTC

Problem

Post by *darkblaze »

Vielen lieben Dank! Das Problem mit dem Skript ist, dass ich es erweitern müsste auf rekursives Durchsuchen aller Verzeichnisse, denn nicht jedes Verzeichnis hat einen "Res"-Ordner und manchmal sind diese Verzeichnisse auch noch sehr verschachtelt. Aber ich habe die Methode in der Powershell versucht, dabei bekomme ich in der dritten Zeile folgende Fehlermeldungen:

"Fehler beim Aufrufen der Methode, da [System.String[]] keine Methode mit dem Namen "contains" enthält.
Bei Zeile:1 Zeichen:48
+ foreach($Folder in $ResMain){if($Res13.contains <<<< ($Folder)){"$Folder renamed"; ren -path "$PWD\$Folder" -new ("$P
WD\_$Folder")}}
+ CategoryInfo : InvalidOperation: (contains:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound"

Shell-Experte bin ich leider nicht ... Nur Programmierer. :)
darkblaze
Junior Member
Junior Member
Posts: 6
Joined: 2015-03-11, 12:26 UTC

Post by *darkblaze »

Danke Dalai!

Das Suchen nach Verzeichnissen mit "Res XY" hab ich jetzt schon herausgefunden, die Ergebnisliste enthält zB:

e:\temp\TEST\Wiest Tool 1\Res 14\Res 140201\
e:\temp\TEST\Wiest Tool 1\Res 14\Res 140808\
e:\temp\TEST\Wiest Tool 1\Res 140201\
e:\temp\TEST\Wiest Tool 1\Res 140808\

Das ganze dann aber mit ca. 1000 Einträgen. Wenn ich da jetzt von Hand Durchgehe sitze ich Stunden, wenn nicht Tage dabei ... :cry:

Ich dachte mir, ev. gibts ja auch eine Möglichkeit mit der "Markieren" - "Gruppenmarkieren" oder ähnliche Funktion, dann in den Ergebnissen zu suchen.
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

Hi Renè,

sorry, ich habe hier mit PoSh v4 getestet.

Welche Version habt ihr? Test in Konsole:

"Ich habe PoSh Version $((host).version.Major)."



Wenn '.contains' nicht funktioniert, probier mal ' -contains' aus:

# foreach($Folder in $ResMain){ if($Res13.contains($Folder)){"$Folder renamed"; ren -path "$PWD\$Folder" -newname ("$PWD\_$Folder")}}
  foreach($Folder in $ResMain){ if($Res13 -contains($Folder)){"$Folder renamed"; ren -path "$PWD\$Folder" -newname ("$PWD\_$Folder")}}




 
darkblaze
Junior Member
Junior Member
Posts: 6
Joined: 2015-03-11, 12:26 UTC

Powershell Version

Post by *darkblaze »

Meine Powershell ist die von Windows 7 Prof und sie meint sie wäre PoSh Version 2.
darkblaze
Junior Member
Junior Member
Posts: 6
Joined: 2015-03-11, 12:26 UTC

Hat funktioniert!

Post by *darkblaze »

"-contains" hat hingehauen.

Allerdings wenn kein "Res 13" Verzeichnis vorhanden ist, haut's das Skript beim zweiten Befehl auf (Pfad kann nicht gefunden werden).

Wie könnte ich denn das Skript erweitern, sodass es rekursiv den Baum durchforstet? Bzw. wieviel Aufwand wäre diese Erweiterung noch. Wenn es irgendwo eine gute Dokumentation gibt, könnte ich mich ins Shellskripten einlesen ...
User avatar
milo1012
Power Member
Power Member
Posts: 1158
Joined: 2012-02-02, 19:23 UTC

Post by *milo1012 »

Hm, da könnte man sich RegEx Look-Around assertions bedienen,
was aber voraussetzt dass

Code: Select all

Res\Res 131102
immer

Code: Select all

Res\Res 13\Res 131102
folgt.
Also am besten TC's Standard-Sortier-Methode einstellen (nach Namen absteigend lassen).



Vorgehen:
Alle Verzeichnisnamen incl. aller Unterverzeichnisse in eine Textdatei kopieren,
also im TC nach Verzeichnissen suchen lassen, so dass
am Ende in der Liste z.B. steht:

Code: Select all

C:\bla\Res\Res 13\Res 131102\
C:\bla\Res\Res 13\Res 130221\
C:\bla\Res\Res 131102\
C:\bla\Res\Res 130221\
C:\bla\Res\Res 131111\
(also Dateien ausblenden lassen mit
Register Erweitert:
[X] Attribute [X] Verzeichnisse
)


Jetzt die Ergebnisliste anwenden.
Dann alles markieren und

Code: Select all

cm_SaveSelectionToFile
nutzen.
(also alle markierten Verzeichnisse werden in eine Textdatei gespeichert)
Lass die Ergebnisliste am besten noch so offen stehen.

Diese grad erzeugte Ausgabedatei jetzt mit z.B. meinem RegXtract-Plugin anwenden.
RegEx:

Code: Select all

(?ms)(^.*?Res\\Res (14|13|12|11|10|09))\\Res \g{2}(\d{4})(?=.*\g{1}\g{3})
Ersatz-Schema

Code: Select all

$1$3\
Alles andere auf Standardeinstellungen lassen.
Ausgabedatei in ein neues Verzeichnis schreiben lassen oder ins selbe aber mit anderen Namen (Ausgabedatei darf nicht Eingabedatei sein).

Jetzt die noch offene Ergebnisliste nutzen und alle Markierungen löschen (oder eine neue Liste erstellen wenn inzwischen geschlossen).
Jetzt das Entscheidende:

Code: Select all

cm_LoadSelectionFromFile
und die eben erzeugte und mit RegEx modifizierte Ausgabedatei laden.
Es sollten jetzt alle Verzeichnisse markiert sein die gelöscht werden sollen.
TC plugins: PCREsearch and RegXtract
darkblaze
Junior Member
Junior Member
Posts: 6
Joined: 2015-03-11, 12:26 UTC

RegXtract

Post by *darkblaze »

Danke Milo,

ich werde mit dem RegXtract-Tool einige Tests durchführen, vielleicht ist das genau das, was ich suche!

LG René
Post Reply