Commande tactile récursive Windows

17

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?

jmq
la source
doublon possible de l' équivalent Windows de la commande Linux 'touch'?
pause jusqu'à nouvel ordre.
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.

JdeBP
la source
2
+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:

trouver . -type f -exec touch {} +
John T
la source
5

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)

Sven Roepke
la source
3
-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.

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:

  • Installez l'application
  • Accédez au répertoire où vous aviez besoin de modifier les horodatages
  • Recherchez * dans la zone de recherche pour que l'explorateur affiche tous les fichiers
  • Une fois tous les fichiers trouvés, sélectionnez-les tous, faites un clic droit dessus et choisissez Propriétés
  • Dans la boîte de dialogue, choisissez l'onglet TimeStamps
  • Ajustez vos dates et heures selon vos besoins et cliquez sur Touch

Voila! Tous vos fichiers ont été mis à jour! Pas besoin d'utilitaires Unix ou de lignes de commande.

Andris
la source
1

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)

afrazier
la source
1

Cela a échoué sur Windows 7 pour moi aussi. J'ai utilisé une syntaxe différente et je l'ai fait fonctionner:

forfiles /c "cmd /c touch @file"

Remarque, je n'ai pas utilisé l'option recurse.

jemiah
la source
1

Utilisation de PowerShell:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date
ThiagoAlves
la source
Cela ne fonctionne pas pour moi:The property 'LastWriteTime' cannot be found on this object.
Ben N
Cela a fonctionné pour moi dans Windows Server 2012: (ls. \ Backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves
0

En référence à la réponse de John T ci-dessus:

J'essayais de comprendre la différence entre terminer une findcommande 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:\myfoldercontenant 2 fichiers a.txtetb.txt

  1. find . -type f -exec touch {} +est interprété comme:
    touch a.txt b.txt
    Ceci est similaire à la façon dont fonctionne xargs

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

Ashutosh Jindal
la source
Grand commentaire avec de bonnes informations, mais pas une réponse à la question. Aurait +1 pour ce commentaire.
TonyG
1
:) Je n'ai aucun souvenir d'avoir fait ce post :)
Ashutosh Jindal
0

Utilisation de PowerShell pour le répertoire actuel et tous les sous-répertoires:

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

Ou vous pouvez spécifier un dossier juste après dir.

icl7126
la source