2013-10-03 12:50:47 +0000 2013-10-03 12:50:47 +0000
53
53

Dateien rekursiv auflisten und nur den vollständigen Pfad und die Dateigröße von der Windows-Eingabeaufforderung aus anzeigen

Ich versuche, eine Textdatei zu erzeugen, die den Dateinamen (einschließlich des vollständigen Pfads) und die Dateigröße für alle Dateien in einem bestimmten Verzeichnis und allen seinen Unterverzeichnissen (d. h. rekursiv) enthält. Idealerweise möchte ich keine Kommas in der Dateigröße (aber ich werde mich mit ihnen zufrieden geben!)

Der folgende Befehl tut es, aber ohne die Dateigröße:

dir /b /s /a:-D > results.txt

Eine Beispielausgabe würde so aussehen:

C:\Users\Martin\Pictures\Table\original\PC120013.JPG 227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG 123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG 932344

Ich glaube nicht, dass dies mit dir allein möglich ist, obwohl ich gerne das Gegenteil beweisen würde. Gibt es eine andere Möglichkeit, dies zu tun, indem nur Befehle verwendet werden, die in der Eingabeaufforderung verfügbar sind?

Antworten (9)

28
28
28
2013-10-03 13:44:16 +0000

Dies sollte genügen:

@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

Es ist nicht sehr effizient… wenn man es für Ordner mit vielen Dateien ausführt, kann es schwierig werden, also versuchen Sie es zuerst mit kleinen Ordnern.

Aus dem Hilfetext “for /?” (ich habe ‘a’ statt ‘I’ verwendet)

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

%~I - expands %I removing any surrounding quotes (")
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only
%~nI - expands %I to a file name only
%~xI - expands %I to a file extension only
%~sI - expanded path contains short names only
%~aI - expands %I to file attributes of file
%~tI - expands %I to date/time of file
%~zI - expands %I to size of file
%~$PATH:I - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

The modifiers can be combined to get compound results:

%~dpI - expands %I to a drive letter and path only
%~nxI - expands %I to a file name and extension only
%~fsI - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI - expands %I to a DIR like output line
15
15
15
2013-10-03 23:34:41 +0000

Alternative #1: FOR /R ist für mich intuitiver als #2.
Alternative #2: FOR /F behebt das Problem mit “Leerzeichen in Namen” in BrianAdkins’ Vorschlag.
Alternative #3: FORFILES wäre meine Wahl, außer dass der Pfad in Anführungszeichen steht.

Brian oder andere Gurus haben vielleicht eine elegantere Lösung oder können ein Dutzend anderer Lösungen vorschlagen, aber diese drei funktionieren. Ich habe versucht, FOR TOKENS zu verwenden, aber dann musste ich Kopf- und Fußzeilen entfernen, also bin ich wieder zu #1 zurückgekehrt. Ich habe auch erwogen, eine kleine .bat-Datei zu erstellen und sie aufzurufen, aber das fügt eine weitere Datei hinzu (obwohl es eine größere Flexibilität bietet, wie eine Funktion).

Ich habe alle Alternativen mit Verzeichnis- und Dateinamen mit eingebetteten Leerzeichen, einem Dateinamen mit mehr als 200 Zeichen, einem Dateinamen ohne Erweiterung und im Stammverzeichnis eines kleinen Laufwerks getestet (nur um Zeit zu gewinnen; ein wenig langsam - genau wie Brian vorgeschlagen hat - aber das ist die Suche im Windows Explorer auch; deshalb habe ich die App “Everything search” installiert).

Alternative #1: FOR /R

Best(?) Während ich versuchte, herauszufinden, warum Brians Lösung bei mir nicht funktionierte, schaute ich mir HELP FOR an und entschied mich, den /R-Ansatz zu versuchen. (Das Erstellen einer Datei wäre dasselbe wie in Alternative #2. )

@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA

Beispiel - funktioniert (anderes Verzeichnis als oben, um die Rekursion zu demonstrieren)

@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spacesnd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032

Alternative #2: FOR /F

BrianAdkins’ Vorschlag: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

Eine korrigierte Antwort ist:

@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA

Eine vollständigere Antwort mit unterdrückten Verzeichnissen und Ausgabe (angehängt) in eine Datei ist:

@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt

Hinweis: “delims=*” gibt ein Zeichen an, das in Dateinamen nicht erlaubt ist.
Hinweis: Der 2. Befehl unterdrückt auch Verzeichnisse über /a:-d.
Hinweis: Der FOR-Variablenname wurde in Großbuchstaben geschrieben, um die Unterscheidung zwischen Variablen und Variablenparametern zu verdeutlichen, falls jemand andere Variablennamen wählt.
Hinweis: Nur zum Spaß an die Datei angehängt, da der OP nach einer Ausgabe in eine Datei gefragt hat.

Ich nehme an, ich sollte wirklich den Status von ECHO überprüfen und ihn auch zurücksetzen.

Problem - Leerzeichen in Namen

Brians vorgeschlagene Lösung kommt nicht mit Datei- und Ordnernamen klar, die Leerzeichen enthalten (zumindest nicht in meiner Vista-Konfiguration).

Beispiel - Falsch(Ohne Delims; Inklusive Unterdrückung des Verzeichnisses pro OP, aber mit Größe vor und nach dem Dateinamen zur Hervorhebung)

Abgeschnittener Name und Größe (4 von 6 Dateien falsch):

@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
 C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
 C:\DeleteLater\Folder
 C:\DeleteLater\Folder
 C:\DeleteLater\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032

Beispiel - Richtig(Hinweis Ausgabe auf Bildschirm, nicht an Datei angehängt)

@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spacesnd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032

Alternative #3: FORFILES (Zitatausgabe)

Diese Lösung stammt direkt aus den letzten beiden Beispielen in der FORFILES-Dokumentation (forfiles /?).

FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

Kombiniert man diese Beispiele und schreibt sie in eine Datei, erhält man (fast) die Antwort:

forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt

Beachten Sie, dass der Pfad in der Ausgabe in Anführungszeichen steht.
Es spielt keine Rolle, ob echo on oder echo off umgeschaltet wird.
Das Hinzufügen einer Leerzeile, die jedes Verzeichnis trennt, wäre eine triviale Erweiterung des IF.

Vorsicht : Bei Verwendung der Maske /m *.* werden keine Dateien ohne Erweiterung zurückgegeben (wie die letzte Datei im Beispiel)!

Aside : Dies schreibt eine Datei in jedes Verzeichnis mit dem Inhalt genau dieses Verzeichnisses:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt" Nicht das, was der OP wollte, aber manchmal praktisch.

Beispiel - Funktioniert (aber mit vollem Pfad in Anführungszeichen)

forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize"

"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spacesnd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0

Dieses Beispiel enthält ein extra Verzeichnis mit einem superlangen Dateinamen und einen Dateinamen ohne Erweiterung.

Problem: Pfad in Anführungszeichen

Gibt es also eine einfache Möglichkeit, die unerwünschten(?) Anführungszeichen gemäß dem OP-Beispiel zu entfernen und Alternative #3 zu speichern: FORFILES. (Rhetorische Frage: Sind die Anführungszeichen ein Feature oder ein Makel?)

1
1
1
2018-03-23 18:47:14 +0000
powershell "dir | select name,length"

Dies mag bei der Frage des OPs schummeln. Allerdings ist die Frage auf modernen Windows-basierten Systemen nicht mehr relevant. Der Dir-Alias wurde verwendet, um die logische Verknüpfung herzustellen.

1
1
1
2014-02-12 12:47:47 +0000

Mir ist klar, dass dies ein zusätzliches Dienstprogramm erfordert, aber Sie können dies recht einfach mit dem sfk-Dienstprogramm erreichen:

sfk cwd +run -yes "sfk list -size -tab $qfile +toclip"

sfk fromclip > C:\_temp\sfk_list_output.txt

(ich habe den Ansatz mit der sfk-Befehlskette hier )

0
0
0
2017-11-11 17:59:32 +0000

Ich finde den “du”-Befehl ziemlich hilfreich und er funktioniert sowohl unter Windows als auch unter Unix (ich habe ihn benutzt, um zu prüfen, ob alle Dateien kopiert wurden, als ich viele Daten von einem Windows-PC auf einen Linux-Webserver übertragen habe):

du -ah "C:\your_dir" > "C:\file_list.txt"

Ausgaben:

15 C:\your_dir/.htaccess
608 C:\your_dir/folder/hello.txt
1.0 C:\your_dir/folder/subfolder/test.txt
1.0 C:\your_dir/folder/subfolder
1.2M C:\your_dir/folder/world.txt
1.2M C:\your_dir/folder
9.0 C:\your_dir/no_file_ending
11 C:\your_dir/sample document 1.txt
684K C:\your_dir/sample document 2 - äöüßÄÖÜáà.txt
1.9M C:\your_dir

Allerdings konnte ich die Sonderzeichen nur in Notepad korrekt sehen, nicht in Notepad++ (muss irgendein ANSI/UTF-8 Encoding-Ding sein, keine Zeit, das jetzt genau zu analysieren). Auch habe ich keine Lösung gefunden, um die Größe nach dem Dateinamen anzuzeigen. Verwenden Sie die Optionen “b” oder “k” anstelle von “h”, um die Größe in Bytes oder Kilobytes anzuzeigen. Ich hatte einige Probleme, wenn ich den Befehl außerhalb des Ordners, den ich analysieren möchte, ausführte. Geben Sie den Befehl also am besten im richtigen Verzeichnis ein (“C:\Ihr_dir” in diesem Beispiel) und geben Sie es im Befehl an.

0
0
0
2016-07-14 00:19:25 +0000

Im Folgenden zeige ich, wie ich verschiedene Videodateien, die zu viel Platz auf einem Netzlaufwerk beanspruchen, ausfindig gemacht und die Ergebnisse in eine Textdatei auf einem lokalen PC geschrieben habe.

Ich poste meine eigene, etwas verspätete Antwort aus drei Gründen. Erstens: Ich mag prägnante Antworten. Zweitens hat diese eine Skriptzeile bei mir in mehreren Einstellungen funktioniert, auch über ein Netzwerk. Drittens kann die Verwendung von Token, wie Don Vince in seinem möglicherweise obskuren Kommentar unter der Antwort von BrianAdkins schreibt, Probleme mit Dateinamen mit Leerzeichen darin umgehen.

for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt

Mir ist aufgefallen, dass sehr lange Dateipfade/Dateinamen (Hunderte von Zeichen) auch Fehler verursachen können, aber die Suche bleibt bei diesen nicht hängen. Allerdings bleibt der Pfad für Ihr(e) Ziel(e) nicht vollständig erforscht. Wenn Sie das bemerkt haben, können Sie das kompensieren, indem Sie tiefer in die Ordnerstruktur einsteigen, um diesen Fehler zu beseitigen.

Diese Seite ss64 hat eine sehr gute Darstellung der Verwendung des dir-Befehls, listet alle Schalter und viele Schalterkombinationen auf und zeigt mehrere nützliche Beispiele für die richtige Syntax. Sie ist nicht so umfassend wie die verschiedenen Stack-Exchange-Communities, aber es gibt eine deutliche Klarheit in der Darstellung, sobald Sie sich mit der Kommandozeile/Batch-Skripting vertraut gemacht haben.

0
0
0
2017-01-12 13:48:02 +0000

Dies habe ich mit dem folgenden Befehl erreicht:

(for /R "\path\to\directory\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"

Das Ergebnis:

D:\Users\Natasha>(for /R ".\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"

D:\Users\Natasha\Flowers_ (12).jpg 118886

D:\Users\Natasha\SomeFolder\data.txt 1241

D:\Users\Natasha\SomeFolder\CS\Counter-Strike_1.6.exe 272645624

P.S. Dies basiert auf der Antwort von BillR (Alternative #1). In meinem Fall bleibt es jedoch bei @echo off hängen.

-1
-1
-1
2014-09-30 03:41:04 +0000

Lassen Sie das b in dir /b /s /a:-D > results.txt weg und die Ergebnisse sollten wie folgt aussehen (d. h. dir /s/a: -D > results.txt):

Volume in Laufwerk H ist FILES Volume Serial Number is C9EB-112E

Directory of H:\Files

09/29/2014 11:36 PM 0 testing. txt 1 Datei(en) 0 Bytes

Verzeichnis von H:\Video\Action\Comix

10/06/2012 09:51 AM 184.740 file1.txt 07/20/2012 06:21 AM 864.832 file2.txt 08/31/2009 08:47 PM 606.638 file3.txt 08/31/2009 09:07 PM 160.320 file4.txt

-1
-1
-1
2018-03-22 20:22:09 +0000
where * /t

Ohne übermäßig kompliziert zu werden, sollte dies die gewünschte Ausgabe erzeugen. Es gibt ein bisschen mehr aus, als der OP verlangt hat, aber ich dachte, es sei erwähnenswert. Fügen Sie den Schalter /R hinzu, um ein anderes Verzeichnis als das aktuelle anzugeben.