Verzeichnisse mit einer bestimmten Ordnertiefe in einer Stapeldatei

4

Ich möchte mit einer Batch-Datei in der Lage sein, die Dateien in einer Reihe von Ordnern namens "error" zu suchen und anzuzeigen, die sich an einer Reihe verschiedener Stellen befinden.

Der Fehlerordner befindet sich immer in derselben Ordnertiefe, die Namen der Ordner vor ihnen sind jedoch unterschiedlich.

dir /A-d /b C:\Temp\*random_folder_name*\*random_folder_name*\error

Kann ich also eine Zeile erstellen, in der alle Dateien in allen Fehlerordnern angezeigt werden, zwei Ordner "unter", in diesem Beispiel "C: \ Temp"? oder muss ich für jeden Fehlerordner eine dir-Zeile hinzufügen?

Tomas
quelle

Antworten:

0

Sie könnten das installieren GNU Win32 Bibliotheken und Verwendung grep dafür:

dir /b /s *.*|grep "error\\[^\\]*$"

Die empfohlene Installationsmethode ist mit getgnuwin32 .

Übrigens, wenn Sie nur Textdateien sehen wollten, wäre das so:

dir /b /s *.txt|grep "error\\[^\\]*$"

Wenn Sie sicherstellen möchten, dass nur Ordner mit einer bestimmten Tiefe verwendet werden, ist dies etwas komplizierter:

dir /b /s *.*|grep "^\([^\\]*\\\)\{7\}error\\[^\\]*$"

Dies zeigt nur Ergebnisse an, bei denen das Fehlerverzeichnis sieben Verzeichnisse tief ist (aus dem Stammverzeichnis).

krowe
quelle
Bist du sicher? Die letzte Regex sieht falsch aus. Warum flüchten Sie? (. ). {, und }?
dbenham
Ja, ich bin sicher, ich habe alle auf meinem System getestet. Vertrauen Sie mir, diese Charaktere müssen entkommen werden. Ohne geht es nicht.
krowe
Sorry, ich bin es gewohnt, JavaScript Regex zu verwenden. Das ist eine sehr kuriose Designwahl für grep. Die meisten Meta-Charaktere werden geschützt, wenn Sie sie als Literal behandeln möchten. In grep werden einige wörtliche Zeichen jedoch "entkommen", um sie in Metazeichen zu verwandeln. Das ist verrückt!
dbenham
Ja, Hybrid Scripting ist eine leistungsstarke Möglichkeit, die Stapelfunktionen zu erweitern. Ich habe ein anderes, aber verwandtes JScript / Batch-Dienstprogramm erstellt REPL.BAT . Es ist unglaublich nützlich für viele Probleme, die mit reiner Charge nur schwer zu lösen sind.
dbenham
0

Hier ist eine relativ einfache, aber ineffiziente Lösung, die FINDSTR mit einem regulären Ausdruck verwendet. ich benutze [\\] passen \ wegen einer Inkonsistenz unter Vista.

@echo off
dir /b /s c:\temp\*|findstr /rix "c:[\\]temp[\\][^\\]*[\\][^\\]*[\\]error[\\][^\\]*"

Hier ist eine kompliziertere, aber sehr effiziente Lösung mit mehreren FOR-Anweisungen.

@echo off
for /d %%A in (c:\temp\*) do for /d %%B in ("%%A\*") do for %%C in ("%%B\error\*") do echo %%C
dbenham
quelle
0

Windows hat integrierte Alternativen zu grep: find und findstr.

findstr unterstützt einen regulären Ausdruck (Sie können weitere Informationen erhalten, indem Sie eingeben help findstr ), aber Sie werden durch die Ausgabe von dir was scheinbar keine relativen Listen unterstützt ...

dir /A-d /S /B | findstr /B /R /I /X "C:\\Temp\\[^\\]*\\[^\\]*\\error\\.*"
robert
quelle
Diese Regex funktioniert da nicht .* kann beliebig viele \ sein
dbenham
Entschuldigung, das war ein dummer Fehler von mir, bitte überprüfe mein Update.
robert