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?
Bei der "akzeptierten" Antwort in diesem Link geht es darum, .NET-Programmierbibliotheken zu verwenden, um dies für eine Datei zu erreichen. Bei den anderen ging es darum, ein Kontextmenü hinzuzufügen, um einzelne Dateien zu aktualisieren. Ich suchte nach einem eingebauten Befehl, um N Dateien rekursiv zu bearbeiten. Die Antwort unten hat funktioniert, um dies für alle Dateien zu tun. Es ist nicht eingebaut, aber es funktioniert. Vielen Dank.
28.
Es ist auch kein Duplikat der Windows-Version des Unix-Touch-Befehls , da diese Frage speziell nach einer Rekursion fragt. Beachten Sie jedoch, dass einige Antworten auf diese Frage rekursive Formen haben.
JdeBP
Antworten:
19
Es gibt verschiedene Möglichkeiten:
Verwenden Sie einen Port eines Unix- touchBefehls und kombinieren Sie einfach findund touchauf 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 nachmvduperlund 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 touchund 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- touchBefehle, die von Benutzern geschrieben und veröffentlicht wurden. Viele von ihnen unterstützen Optionen zur Durchführung von Rekursionen, ohne dass ein Unix findsie umschließen muss. (Sie zielen schließlich auf eine Nutzerbasis ab, die nach einem touchBefehl 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 --recursiveOption 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 COPYBefehl (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 /SOption 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 .COPYCOPY /SFOR/S
-1 Mit diesen Befehlen werden die Dateien aus den Unterordnern in das Stammverzeichnis kopiert, und das Ergebnis ist ein Durcheinander.
TonyG
1
+1 Eine kleine Änderung, um das zu korrigieren, was @TonyG gesagt hat: forfiles / S / C "cmd / c Copy / B nul: + ,,"
Alex Dupuis
ändert sich nicht zuletzt geändert
beppe9000
4
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.
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 forBefehl verwenden möchten , stellen Sie sicher, dass Sie doppelte Prozentzeichen für Ihre Variablen verwenden (z. B. %%ianstelle von %i).
Das funktioniert bei mir nicht:The property 'LastWriteTime' cannot be found on this object.
Ben N
In Windows Server 2012 hat es funktioniert: (ls. \ Backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves
0
In Bezug auf die Antwort von John T oben:
Ich habe versucht, den Unterschied zwischen dem Beenden eines findexec-Befehls mit einem \;und einem "+" zu verstehen (letzteres hatte ich nicht gewusst).
-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:\myfoldermit 2 Dateien a.txtundb.txt
find . -type f -exec touch {} +wird interpretiert als: touch a.txt b.txt Dies ähnelt der Funktionsweise von xargs
wohingegen 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 execnur einen {}Platzhalter haben kann).
Antworten:
Es gibt verschiedene Möglichkeiten:
Verwenden Sie einen Port eines Unix-
touch
Befehls und kombinieren Sie einfachfind
undtouch
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
undawk
. 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 hattouch
undfind
, 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 Unixfind
sie umschließen muss. (Sie zielen schließlich auf eine Nutzerbasis ab, die nach einemtouch
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 vonCOPY
Befehl (mehr gefunden werden , kann hier übrigens). Dies kann natürlich kombiniert werdenFOR /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
quelle
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
undtouch
, die dies sehr einfach machen.Nach dem Wechsel in das oberste Verzeichnis, das Sie ändern möchten:
quelle
Führen Sie einen der folgenden Schritte aus, um nur vorhandene Windows-Funktionen zu verwenden (keine zusätzliche Installation erforderlich):
(Berühren Sie rekursiv alle Dateien, die im angegebenen Pfad beginnen.)
ODER
(Berühren Sie rekursiv alle Dateien, die im aktuellen Verzeichnis beginnen.)
quelle
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.
quelle
Sie können auch die bereits in Windows integrierten Tools verwenden, wenn Sie bereits ein Touch-Tool haben:
ODER
(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
).quelle
Es ist auch für mich unter Windows 7 fehlgeschlagen. Ich habe eine andere Syntax verwendet und es funktioniert:
Beachten Sie, dass ich die Option "Rekursion" nicht verwendet habe.
quelle
Verwenden von Powershell:
quelle
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 Dateiena.txt
undb.txt
find . -type f -exec touch {} +
wird interpretiert als:touch a.txt b.txt
Dies ähnelt der Funktionsweise von xargs
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).quelle
Verwenden von PowerShell für das aktuelle Verzeichnis und alle Unterverzeichnisse:
Oder Sie können gleich danach einen Ordner angeben
dir
.quelle