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?
La réponse "acceptée" dans ce lien concerne l'utilisation des bibliothèques de programmation .NET pour accomplir cela pour un fichier. Les autres étaient sur l'ajout d'un menu contextuel pour mettre à jour des fichiers uniques. Je cherchais une commande intégrée pour le faire sur N fichiers de manière récursive. La réponse ci-dessous a fonctionné pour le faire pour tous les fichiers. Ce n'est pas une fonction intégrée, mais cela fonctionne. Merci.
jmq
Ce n'est pas non plus un doublon de la version Windows de la commande tactile Unix , car cette question demande spécifiquement une récursivité. Cependant, notez que quelques réponses à cette question ont des formes récursives.
JdeBP
Réponses:
19
Il existe plusieurs possibilités:
Utilisez un port d'une touchcommande Unix et combinez simplement findet touchde 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 mvet du, via les shells Korn et C, pourperlet 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 touchet 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 touchcommandes 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 findde les entourer. (Ils visent, après tout, une base d'utilisateurs qui recherche une touchcommande 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 --recursiveoption.
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 COPYcommande (qui peut être trouvée ici en passant). Bien sûr, cela peut être combiné avec FOR /Rpour 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 /Soption à sa COPYcommande , ce qui signifie que l'on pourrait utiliser COPY /Savec la syntaxe "plus" pour éliminer le besoin d'un FORwrapper. 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 /Soption.
+1, COPY /B file+,,c'est le chemin à parcourir, ne nécessite aucun extras ... :-)
Tamara Wijsman
3
The Powershell way:(ls file).LastWriteTime = DateTime.now
Tamara Wijsman
5
Puisqu'ils sont facilement disponibles, je recommanderais de profiter des unxutils . Ils incluent les commandes findet touchqui rendront cela très facile.
Après être passé au répertoire le plus haut que vous souhaitez modifier:
-1 En l'état, ces commandes copient les fichiers des sous-dossiers vers la racine et le résultat est un gâchis.
TonyG
1
+1 Un petit twist pour corriger ce que @TonyG a dit: forfiles / S / C "cmd / c Copy / B nul: + ,,"
Alex Dupuis
ne change pas dernière modification
beppe9000
4
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.
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 forcommande, assurez-vous d'utiliser des signes de double pour cent pour vos variables (par exemple %%iau lieu de %i)
-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:\myfoldercontenant 2 fichiers a.txtetb.txt
find . -type f -exec touch {} +est interprété comme: touch a.txt b.txt Ceci est similaire à la façon dont fonctionne xargs
alors qu'il 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 execne peut avoir qu'un seul {}espace réservé).
Réponses:
Il existe plusieurs possibilités:
Utilisez un port d'une
touch
commande Unix et combinez simplementfind
ettouch
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, depuismv
etdu
, via les shells Korn et C, pourperl
etawk
. 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 quecygwin1.dll
) superposant des éléments sur Win32. Et oui, la boîte à outils atouch
etfind
, 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 Unixfind
de les entourer. (Ils visent, après tout, une base d'utilisateurs qui recherche unetouch
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 laCOPY
commande (qui peut être trouvée ici en passant). Bien sûr, cela peut être combiné avecFOR /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 à saCOPY
commande , ce qui signifie que l'on pourrait utiliserCOPY /S
avec la syntaxe "plus" pour éliminer le besoin d'unFOR
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.la source
COPY /B file+,,
c'est le chemin à parcourir, ne nécessite aucun extras ... :-)(ls file).LastWriteTime = DateTime.now
Puisqu'ils sont facilement disponibles, je recommanderais de profiter des unxutils . Ils incluent les commandes
find
ettouch
qui rendront cela très facile.Après être passé au répertoire le plus haut que vous souhaitez modifier:
la source
Pour utiliser uniquement les fonctionnalités Windows existantes (rien de plus à installer), essayez l'une des options suivantes:
("toucher" récursivement tous les fichiers commençant par le chemin spécifié)
OU
("toucher" récursivement tous les fichiers commençant dans le répertoire courant)
la source
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.
la source
Ou vous pouvez utiliser les outils déjà intégrés à Windows, une fois que vous avez déjà un outil "tactile" quelconque:
OU
(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
)la source
Cela a échoué sur Windows 7 pour moi aussi. J'ai utilisé une syntaxe différente et je l'ai fait fonctionner:
Remarque, je n'ai pas utilisé l'option recurse.
la source
Utilisation de PowerShell:
la source
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 fichiersa.txt
etb.txt
find . -type f -exec touch {} +
est interprété comme:touch a.txt b.txt
Ceci est similaire à la façon dont fonctionne xargs
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é).la source
Utilisation de PowerShell pour le répertoire actuel et tous les sous-répertoires:
Ou vous pouvez spécifier un dossier juste après
dir
.la source