dos-Befehl kaputt?
Hallo ich habe gelesen, dass der dos-Befehl:
forfiles /S /C "cmd /c if @fsize GTR 1073741824 echo @path > big_files.txt"
große dateien anzeigen können soll.
Aber wenn ich den in einem Dos-Eingabe-Fenster verwende, wandert nur der Cursor in die nächste zeile, ohne das aktive verzeichnis zu wiederholen und nichts passiert mehr.
Der Cursor mlinkt, aber es reagiert nicht auf Eingaben.
Funktioniert der Befehl nicht richtig, oder braucht es lange um die Dateien zu finden?
Nach einer Weile kam schließlich eine Meldung
FEHLER: Das System kann die angegebene Datei nicht finden.
Muss ich bereits eine txt-Datei mit entsprechendem Namen vorbereitet haben?
2 Antworten
Je nachdem, in welchem Verzeichnis du startest, läuft der Befehl ein paar Sekunden bis Stunden. In meinem Benutzerverzeichnis benötigt er mehrere Minuten.
Worauf schon @quick hingewiesen hat: die Ausgabeanweisung "> big_files.txt" muss außerhalb der Anführungszeichen stehen - sonst wird die Ausgabedatei bei jedem Fund überschrieben und es steht nur eine einzige Datei darin.
for /f arbeitet in diesem Fall - zumindest bei mir - um Größenordnungen schneller als forfiles:
( for /f " delims=" %A in ('dir /s /b') do @(if %~zA GTR 1048576 echo %A) ) > big_files.txt
(beachte die Klammern vor der Ausgabeumleitung - auch hier würde die Ausgabedatei sonst bei jedem Fund überschrieben).
Ich hatte die Zeile bei mir ausprobiert. IF benötigt keine Klammern (und wie ein Test gerade eben ergibt, mag es auch keine Klammern um den Vergleichsausdruck).
Allerdings habe ich tatsächlich etwas vergessen - nämlich die Anführungszeichen um den Dateinamen %A:
( for /f " delims=" %A in ('dir /a /s /b') do @(if %~zA GTR 1048576 echo "%A") ) > big_files.txt
Noch etwas: falls du dies in einer "Batch-Datei" / einem "Batch-Script" ausführen willst, musst du die Prozentzeichen verdoppeln:
( for /f " delims=" %%A in ('dir /a /s /b') do @(if %%~zA GTR 1048576 echo "%%A") ) > big_files.txt
Weiterer Kommentar: Ich habe hier die Mindestgröße auf 1 MiB reduziert, damit in meinem Benutzerverzeichnis überhaupt eine Datei gefunden wird. Die Zahl 1048576 müsstest du dann wieder anpassen.
Wenn du auch versteckte Dateien anzeigen lassen willst,:
( for /f " delims=" %A in ('dir /a /s /b') do @(if %~zA GTR 1048576 echo %A) ) > big_files.txt
Das "/a-d" schließt Verzeichnisse aus (spielt keine Rolle, weil deren Größe sowieso mit 0 angegeben wird), aber ausdrücklich alle Dateien ein, egal, welche Attribute sie haben.
forfiles /S /C "cmd /c if @fsize GTR 1073741824 echo @path" > big_files.txt
Anführungszeichen kommt vor der Ausgabe >big_files.txt
Dreht aber natürlich eine Weile, das File wird aber sofort erstellt. So siehst du, wenn es klappt
Da kommt immernoch
FEHLER: Das System kann die angegebene Datei nicht finden.
Wenn ich deine Zeile versuche, kommt das hier:
In Zeile:1 Zeichen:48
+ ( for /f " delims=" %A in ('dir /s /b') do @(if %~zA GTR 1048576 echo ...
+ ~
"(" fehlt nach "if" in der "if"-Anweisung.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingOpenParenthesisInIfStatement