Windows-Befehl für rekursive Berührung


17

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


2
+1, das COPY /B file+,,ist der Weg zu gehen, erfordert keine Extras ... :-)
Tamara Wijsman

3
Die Powershell-Methode:(ls file).LastWriteTime = DateTime.now
Tamara Wijsman

5

Da sie leicht verfügbar sind, würde ich empfehlen, die unxutils zu nutzen . Sie enthalten die Befehle findund touch, die dies sehr einfach machen.

Nach dem Wechsel in das oberste Verzeichnis, das Sie ändern möchten:

finden . -type f -exec touch {} +

5

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.)


3
-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.

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:

  • Installieren Sie die Anwendung
  • Wechseln Sie in das Verzeichnis, in dem Sie Zeitstempel ändern mussten
  • Suchen Sie im Suchfeld nach *, damit der Explorer alle Dateien anzeigt
  • Wenn alle Dateien gefunden wurden, wählen Sie sie alle aus, klicken Sie mit der rechten Maustaste darauf und wählen Sie Eigenschaften
  • Wählen Sie im Dialog die Registerkarte Zeitstempel
  • Passen Sie Ihre Daten und Zeiten nach Bedarf an und klicken Sie auf Berühren

Voila! Alle Ihre Dateien wurden aktualisiert! Keine Notwendigkeit für Unix-Utils oder Befehlszeilen.


1

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).


1

Es ist auch für mich unter Windows 7 fehlgeschlagen. Ich habe eine andere Syntax verwendet und es funktioniert:

forfiles /c "cmd /c touch @file"

Beachten Sie, dass ich die Option "Rekursion" nicht verwendet habe.


1

Verwenden von Powershell:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

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).

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:\myfoldermit 2 Dateien a.txtundb.txt

  1. find . -type f -exec touch {} +wird interpretiert als:
    touch a.txt b.txt
    Dies ähnelt der Funktionsweise von xargs

  2. 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).


Toller Kommentar mit guten Infos, aber keine Antwort auf die Frage. Hätte +1 gegeben, wenn dies ein Kommentar wäre.
TonyG

1
:) Ich habe keine Erinnerung daran, diesen Beitrag
Ashutosh Jindal

0

Verwenden von PowerShell für das aktuelle Verzeichnis und alle Unterverzeichnisse:

dir -R | foreach { $_.LastWriteTime = [System.DateTime]::Now }

Oder Sie können gleich danach einen Ordner angeben dir.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.