Sous Windows 7, comment puis-je toucher récursivement tous les fichiers d'un répertoire (y compris les sous-répertoires) afin de mettre à jour l'horodatage?
Windows 7 dispose-t-il d'un mécanisme pour y parvenir?
Sous Windows 7, comment puis-je toucher récursivement tous les fichiers d'un répertoire (y compris les sous-répertoires) afin de mettre à jour l'horodatage?
Windows 7 dispose-t-il d'un mécanisme pour y parvenir?
Réponses:
Il existe plusieurs possibilités:
Utilisez un port d'une touch
commande Unix et combinez simplement find
et touch
de la manière Unix. Il y a plusieurs choix. On mentionne souvent GNUWin32 , cygwin et unxutils . Moins connus, mais d'une certaine manière meilleurs, les outils de la boîte à outils de l' utilitaire SFUA , qui s'exécutent dans le sous - système pour les applications UNIX , sont fournis avec Windows 7 Ultimate Edition et Windows Server 2008 R2. (Pour Windows XP, on peut télécharger et installer les services pour UNIX version 3.5 .) Cette boîte à outils possède un grand nombre d'outils TUI en ligne de commande, depuis mv
et du
, via les shells Korn et C, pourperl
et awk
. Il est disponible en versions x86-64 et IA64 ainsi qu'en x86-32. Les programmes s'exécutent dans l'environnement POSIX natif de Windows, plutôt qu'avec des DLL d'émulation (telles que cygwin1.dll
) superposant des éléments sur Win32. Et oui, la boîte à outils a touch
et find
, ainsi que quelque 300 autres.
Tous ces kits d'outils ont l'inconvénient bien connu d'exécuter un processus distinct pour chaque fichier à toucher, bien sûr. Ce n'est pas un problème avec les alternatives suivantes.
Utilisez l'une des nombreuses touch
commandes Win32 natives que les utilisateurs ont écrites et publiées. Beaucoup d'entre eux prennent en charge les options pour effectuer la récursivité, sans la nécessité pour Unix find
de les entourer. (Ils visent, après tout, une base d'utilisateurs qui recherche une touch
commande car elle n'a pas une charge complète de commandes Unix portées.) L'une de celles-ci est celle de Stéphane Duguaytouch
qui, comme vous pouvez le voir, a une --recursive
option.
Soyez intelligent avec les mystères mystérieux de CMD. Comme mentionné dans l'autre réponse, COPY /B myfile+,,
mettra à jour le dernier horodatage de modification d'un fichier, en utilisant la syntaxe "plus" peu connue de la COPY
commande (qui peut être trouvée ici en passant). Bien sûr, cela peut être combiné avec FOR /R
pour effectuer l'opération de manière récursive, comme indiqué dans une autre réponse ici.
Utilisez un interpréteur de commandes de remplacement et soyez moins intelligent et plus simple que CMD. Le TCC / LE de JP Software en est un. Il ajoute une /S
option à sa COPY
commande , ce qui signifie que l'on pourrait utiliser COPY /S
avec la syntaxe "plus" pour éliminer le besoin d'un FOR
wrapper. Mais cela rend vraiment la vie inutilement difficile, étant donné que TCC / LE a une commande TOUCH intégrée qui prend directement en charge une /S
option.
COPY /B file+,,
c'est le chemin à parcourir, ne nécessite aucun extras ... :-)
(ls file).LastWriteTime = DateTime.now
Pour utiliser uniquement les fonctionnalités Windows existantes (rien de plus à installer), essayez l'une des options suivantes:
forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"
("toucher" récursivement tous les fichiers commençant par le chemin spécifié)
OU
forfiles /S /C "cmd /c Copy /B @path+,,"
("toucher" récursivement tous les fichiers commençant dans le répertoire courant)
Je sais que c'est probablement un peu trop tard mais néanmoins, je vais laisser ma réponse au cas où quelqu'un d'autre aurait besoin de la même chose.
La réponse de John T n'a pas fonctionné pour moi sur Windows 7. Après quelques recherches, j'ai trouvé cet utilitaire appelé SKTimeStamp , qui fait parfaitement le travail.
Voici un article avec plus de détails sur son fonctionnement: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -accessé / .
Voici les étapes que vous devez effectuer:
Voila! Tous vos fichiers ont été mis à jour! Pas besoin d'utilitaires Unix ou de lignes de commande.
Ou vous pouvez utiliser les outils déjà intégrés à Windows, une fois que vous avez déjà un outil "tactile" quelconque:
for /r %i in (C:\Path\To\Root\*) do @touch "%i"
OU
forfiles /P C:\Path\To\Root /S /C "touch @file"
(NB: si vous faites cela à partir d'un fichier de commandes et que vous souhaitez utiliser la for
commande, assurez-vous d'utiliser des signes de double pour cent pour vos variables (par exemple %%i
au lieu de %i
)
Utilisation de PowerShell:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
En référence à la réponse de John T ci-dessus:
J'essayais de comprendre la différence entre terminer une find
commande exec avec un avec \;
un `+ '(je ne connaissais pas ce dernier).
Cela a été utile: (d' ici )
-exec command ;
Exécuter la commande; true si l'état 0 est renvoyé. Tous les arguments suivants à rechercher sont considérés comme des arguments de la commande jusqu'à ce qu'un argument composé de ';' est rencontré. La chaîne '{}' est remplacée par le nom de fichier actuel en cours de traitement partout où il apparaît dans les arguments de la commande, pas seulement dans les arguments où il est seul, comme dans certaines versions de find.
-exec command {} +
Cette variante de l'action -exec exécute la commande spécifiée sur les fichiers sélectionnés, mais la ligne de commande est créée en ajoutant à la fin chaque nom de fichier sélectionné; le nombre total d'appels de la commande sera bien inférieur au nombre de fichiers correspondants. La ligne de commande est construite de la même manière que xargs construit ses lignes de commande. Une seule instance de '{}' est autorisée dans la commande. La commande est exécutée dans le répertoire de départ.
Considérons un dossier c:\myfolder
contenant 2 fichiers a.txt
etb.txt
find . -type f -exec touch {} +
est interprété comme: touch a.txt b.txt
find . -type f -exec touch {} \;
est interprété comme:touch a.txt
touch b.txt
Ainsi, # 1 est beaucoup plus rapide (mais souffre également de la limitation selon laquelle la commande suivante exec
ne peut avoir qu'un seul {}
espace réservé).