Listen Sie Dateien rekursiv auf und zeigen Sie nur den vollständigen Pfad und die Dateigröße aus der Windows-Eingabeaufforderung an

Listen Sie Dateien rekursiv auf und zeigen Sie nur den vollständigen Pfad und die Dateigröße aus der Windows-Eingabeaufforderung an

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

Der folgende Befehl erledigt dies, allerdings ohne Angabe der Dateigröße:

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

Eine Beispielausgabe würde wie folgt 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 dirallein möglich ist, würde mich aber freuen, wenn mir das Gegenteil bewiesen würde. Gibt es eine andere Möglichkeit, dies zu tun, indem man nur Befehle verwendet, die in der Eingabeaufforderung verfügbar sind?

Antwort1

Das hier sollte genügen:

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

Es ist nicht sehr effizient. Es für Ordner mit einer Menge Dateien auszuführen, kann problematisch sein. Probieren Sie es daher zuerst mit kleinen Ordnern aus.

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

Antwort2

Alternative Nr. 1: FOR /R ist für mich intuitiver als Nr. 2.
Alternative Nr. 2: FOR /F behebt das Problem mit „Leerzeichen in Namen“ in BrianAdkins‘ Vorschlag.
Alternative Nr. 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, musste dann aber Kopf- und Fußzeilen entfernen, also bin ich zu Nr. 1 zurückgekehrt. Ich habe auch überlegt, eine kleine .bat-Datei zu erstellen und sie aufzurufen, aber das fügt eine weitere Datei hinzu (obwohl es mehr Flexibilität bietet, wie es eine Funktion tun würde).

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 aus Zeitgründen; ein wenig langsam – genau wie Brian vorgeschlagen hat – aber das ist die Suche im Windows Explorer auch; deshalb habe ich die Such-App „Everything“ installiert).

Alternative Nr. 1: FOR /R

Am besten(?)Während ich versuchte herauszufinden, warum Brians Lösung bei mir nicht funktionierte, schaute ich mir HELP FOR an und beschloss, den /R-Ansatz auszuprobieren. (Das Erstellen einer Datei wäre dasselbe wie bei Alternative Nr. 2.)

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

Beispiel - Funktioniert(anderes Verzeichnis als oben, um 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 Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

Alternative Nr. 2: FOR /F

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

Akorrigierte AntwortIst:

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

AvollständigerDie Antwort mit unterdrückten Verzeichnissen und der Ausgabe (angehängt) an eine Datei lautet:

@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 in Dateinamen nicht zulässiges Zeichen an.
Hinweis: Der 2. Befehl unterdrückt auch Verzeichnisse über /a:-d.
Hinweis: Der FOR-Variablenname wurde in Großbuchstaben geschrieben, um die Unterscheidung zwischen Variable und Variablenparametern zu verdeutlichen, wenn jemand andere Variablennamen wählt.
Hinweis: Nur zum Spaß an die Datei angehängt, da der OP um die Ausgabe in eine Datei gebeten hat.

Ich denke, ich sollte wirklich den Status von ECHO überprüfen und es ebenfalls zurücksetzen.

Problem - Leerzeichen in Namen

Die von Brian vorgeschlagene Lösung kann keine Datei- und Ordnernamen mit Leerzeichen verarbeiten (zumindest nicht in meiner Vista-Konfiguration).

Beispiel - Falsch (Ohne Trennzeichen; beinhaltet die Unterdrückung des Verzeichnisses pro OP, jedoch mit Angabe der 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\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

Beispiel - Richtig (Beachten Sie, dass die Ausgabe auf dem Bildschirm erfolgt und nicht an die Datei angehängt wird)

@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 Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

Alternative Nr. 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"

Die Kombination dieser Beispiele und das Schreiben in eine Datei ergibt (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 onoder echo offumgeschaltet ist.
Das Hinzufügen einer Leerzeile zwischen den einzelnen Verzeichnissen wäre eine triviale Erweiterung des IF.

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

Beiseite: Dadurch wird in jedes Verzeichnis eine Datei mit dem Inhalt nur dieses Verzeichnisses geschrieben:
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 vollständigem 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 Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.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 zusätzliches Verzeichnis mit einem sehr langen Dateinamen und einem 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 Nr. 3 zu speichern: FORFILES. (Rhetorische Frage: Sind die Anführungszeichen ein Feature oder ein Fehler?)

Antwort3

Ich finde den Befehl „du“ ziemlich hilfreich und er funktioniert sowohl unter Windows als auch unter Unix (habe ihn verwendet, 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"

Ausgänge:

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 richtig sehen, nicht in Notepad++ (muss irgendwas mit ANSI/UTF-8-Kodierung sein, ich habe gerade keine Zeit, das genau zu analysieren). Außerdem 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, als ich den Befehl außerhalb des Ordners ausführte, den ich analysieren möchte. Geben Sie den Befehl also am besten sowohl im richtigen Verzeichnis ein („C:\Ihr_Verzeichnis“ in diesem Beispiel) als auch es im Befehl anzugeben.

Antwort4

Mir ist klar, dass hierfür ein zusätzliches Dienstprogramm erforderlich ist, aber Sie können dies ziemlich prägnant erreichen, indem Sie denSFK-Dienstprogramm:

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

sfk fromclip > C:\_temp\sfk_list_output.txt

(Ich habe den Ansatz mitsfk-Befehlsverkettung hier)

verwandte Informationen