Wie kann ich unter Windows 7 alle Dateien in einem Verzeichnis (einschließlich Unterverzeichnissen) rekursiv berühren, um den Datums- / Zeitstempel zu aktualisieren?
Verfügt Windows 7 über einen Mechanismus, um dies zu erreichen?
Wie kann ich unter Windows 7 alle Dateien in einem Verzeichnis (einschließlich Unterverzeichnissen) rekursiv berühren, um den Datums- / Zeitstempel zu aktualisieren?
Verfügt Windows 7 über einen Mechanismus, um dies zu erreichen?
Antworten:
Es gibt verschiedene Möglichkeiten:
Verwenden Sie einen Port eines Unix- touch
Befehls und kombinieren Sie einfach find
und touch
auf die Unix-Weise. Es gibt mehrere Möglichkeiten. Oft erwähnt werden GNUWin32 , Cygwin und Unxutils . Weniger bekannt, aber in gewisser Hinsicht besser, sind die Tools im SFUA-Dienstprogramm-Toolkit , die im Subsystem für UNIX-basierte Anwendungen ausgeführt werden , das in Windows 7 Ultimate Edition und Windows Server 2008 R2 enthalten ist. (Unter Windows XP können Sie Services for UNIX Version 3.5 herunterladen und installieren .) Dieses Toolkit enthält eine große Anzahl von Befehlszeilen-TUI-Tools von und über die Korn- und C-Shells nachmv
du
perl
und awk
. Es ist sowohl in den Varianten x86-64 und IA64 als auch in x86-32 erhältlich. Die Programme werden in der nativen POSIX-Umgebung von Windows ausgeführt, anstatt mit Emulator-DLLs (wie z. B. cygwin1.dll
), die Dinge über Win32 schichten. Und ja, das Toolkit hat touch
und find
, sowie rund 300 andere.
Alle diese Toolkits haben natürlich den bekannten Nachteil, dass für jede zu berührende Datei ein eigener Prozess ausgeführt wird. Mit den folgenden Alternativen ist das kein Problem.
Verwenden Sie einen der vielen nativen Win32- touch
Befehle, die von Benutzern geschrieben und veröffentlicht wurden. Viele von ihnen unterstützen Optionen zur Durchführung von Rekursionen, ohne dass ein Unix find
sie umschließen muss. (Sie zielen schließlich auf eine Nutzerbasis ab, die nach einem touch
Befehl sucht, weil sie nicht über eine ganze Reihe portierter Unix-Befehle verfügt.) Einer davon ist der von Stéphane Duguay,touch
der, wie Sie sehen, eine --recursive
Option hat.
Machen Sie sich mit den arkanen Geheimnissen von CMD schlau. Wie in der anderen Antwort erwähnt, COPY /B myfile+,,
wird eine Datei der letzten Änderung Zeitstempel aktualisieren, die wenig bekannte „plus“ Syntax der Verwendung von COPY
Befehl (mehr gefunden werden , kann hier übrigens). Dies kann natürlich kombiniert werden FOR /R
, um die Operation rekursiv auszuführen, wie in einer anderen Antwort hier angedeutet.
Verwenden Sie einen Ersatzbefehlsinterpreter und seien Sie weniger clever und unkomplizierter als CMD. Das TCC / LE von JP Software ist eines davon. Es fügt seinem Befehl eine /S
Option hinzu , was bedeutet, dass mit der "Plus" -Syntax die Notwendigkeit eines Wrappers beseitigt werden kann . Aber das macht es einem trotzdem unnötig schwer, wenn man bedenkt, dass TCC / LE einen eingebauten TOUCH-Befehl hat , der eine Option direkt unterstützt .COPY
COPY /S
FOR
/S
COPY /B file+,,
ist der Weg zu gehen, erfordert keine Extras ... :-)
(ls file).LastWriteTime = DateTime.now
Da sie leicht verfügbar sind, würde ich empfehlen, die unxutils zu nutzen . Sie enthalten die Befehle find
und touch
, die dies sehr einfach machen.
Nach dem Wechsel in das oberste Verzeichnis, das Sie ändern möchten:
finden . -type f -exec touch {} +
Führen Sie einen der folgenden Schritte aus, um nur vorhandene Windows-Funktionen zu verwenden (keine zusätzliche Installation erforderlich):
forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"
(Berühren Sie rekursiv alle Dateien, die im angegebenen Pfad beginnen.)
ODER
forfiles /S /C "cmd /c Copy /B @path+,,"
(Berühren Sie rekursiv alle Dateien, die im aktuellen Verzeichnis beginnen.)
Ich weiß, dass dies wahrscheinlich ein bisschen zu spät ist, aber trotzdem werde ich meine Antwort für den Fall hinterlassen, dass jemand anderes dasselbe braucht.
Die Antwort von John T funktionierte unter Windows 7 nicht. Nach einigen Recherchen fand ich dieses Dienstprogramm namens SKTimeStamp , das die Aufgabe perfekt erledigt.
Hier ist ein Artikel mit weiteren Details zur Funktionsweise: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -zugegriffen / .
Hier sind die Schritte, die Sie ausführen müssen:
Voila! Alle Ihre Dateien wurden aktualisiert! Keine Notwendigkeit für Unix-Utils oder Befehlszeilen.
Sie können auch die bereits in Windows integrierten Tools verwenden, wenn Sie bereits ein Touch-Tool haben:
for /r %i in (C:\Path\To\Root\*) do @touch "%i"
ODER
forfiles /P C:\Path\To\Root /S /C "touch @file"
(Hinweis: Wenn Sie dies aus einer Batch-Datei heraus tun und den for
Befehl verwenden möchten , stellen Sie sicher, dass Sie doppelte Prozentzeichen für Ihre Variablen verwenden (z. B. %%i
anstelle von %i
).
Verwenden von Powershell:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
In Bezug auf die Antwort von John T oben:
Ich habe versucht, den Unterschied zwischen dem Beenden eines find
exec-Befehls mit einem \;
und einem "+" zu verstehen (letzteres hatte ich nicht gewusst).
Dies war nützlich: (von hier )
-exec command ;
Befehl ausführen; true, wenn der Status 0 zurückgegeben wird. Alle folgenden zu suchenden Argumente gelten als Argumente für den Befehl, bis ein Argument aus ';' angetroffen wird. Die Zeichenfolge '{}' wird durch den aktuellen Dateinamen ersetzt, der überall dort verarbeitet wird, wo er in den Argumenten des Befehls vorkommt, nicht nur in Argumenten, in denen er alleine ist, wie in einigen Versionen von find.
-exec command {} +
Diese Variante der Aktion -exec führt den angegebenen Befehl für die ausgewählten Dateien aus. Die Befehlszeile wird jedoch erstellt, indem jeder ausgewählte Dateiname am Ende angehängt wird. Die Gesamtzahl der Aufrufe des Befehls ist viel geringer als die Anzahl der übereinstimmenden Dateien. Die Befehlszeile ist in etwa so aufgebaut wie die Befehlszeilen von xargs. Innerhalb des Befehls ist nur eine Instanz von '{}' zulässig. Der Befehl wird im Startverzeichnis ausgeführt.
Betrachten Sie einen Ordner c:\myfolder
mit 2 Dateien a.txt
undb.txt
find . -type f -exec touch {} +
wird interpretiert als: touch a.txt b.txt
find . -type f -exec touch {} \;
interpretiert wird als:touch a.txt
touch b.txt
Somit ist # 1 viel schneller (hat aber auch die Einschränkung, dass der folgende Befehl exec
nur einen {}
Platzhalter haben kann).