Windows équivalent de la commande Linux 'touch'?

175

Qu'est-ce que vous utilisez lorsque vous souhaitez mettre à jour le champ date-modifié d'un fichier sous Windows?

  1. commandes accessibles via C ++, .NET, C # ou quelque chose de natif à Windows (Vista de préférence)
  2. outils / applications de préférence libres, et si open source possible aussi bien

Edit: il y a déjà une page pour les applications comme l' a souligné CheapScotsman ici .

Si quelqu'un sait comment je peux le faire via C ++, C #, WSH ou quelque chose de similaire, tout va bien, sinon je penserais que tout le reste est couvert dans la question liée.

facepalmd
la source
Les quatre alternatives mentionnées ci-dessus, plus quatre autres non mentionnées ici, se trouvent dans la réponse à une question similaire: "Commande tactile récursive Windows"
JdeBP Le
stackoverflow.com/questions/210201/… mentionne une charge, notammentREM.>a
barlop

Réponses:

356

Si vous souhaitez toucher l'horodatage d'un fichier à l'aide de Windows, utilisez la commande suivante à l'invite de commande:

copy /b filename.ext +,,

(où filename.extest le nom de votre fichier). Le +,,est un drapeau spécial pour copylui dire de simplement mettre à jour la date / heure sur le fichier :

* Changer l'heure et la date d'un fichier

Si vous souhaitez attribuer l'heure et la date actuelles à un fichier sans le modifier, utilisez la syntaxe suivante:

copy /b Source+,,

Les virgules indiquent l'omission du paramètre Destination.

Modifier basé sur les commentaires de Lumi et Justin: mettez ceci dans un fichier batch, par exemple. touch.cmd

@COPY /B %1+,, %1

Cela fonctionne même si le fichier ne se trouve pas dans le répertoire actuel (testé sous Windows 7).

EM0
la source
4
Ce sera lent si les fichiers sont volumineux.
Mob
14
type touch.batis @echo offet next line copy /b %1 +,,- mettez-le dans C:\binou ce que vous avez pour vos propres scripts, et ensuite vous pourrez l’utiliser comme touch myfile.txt.
Lumi
17
Sous Win7, cela ne fonctionnera pas si vous ne vous trouvez pas dans le dossier contenant le fichier. Il en créera une copie dans le répertoire de travail actuel.
6
Si vous avez besoin de le faire dans un dossier distant (chemin UNC) - vous devez également spécifier la destination de la commande de copie - copy /b Source+,, Source- où Sourceinclut le chemin d'accès complet au fichier
Justin
162

J'ai utilisé et recommandé unxutils, qui sont des ports Win32 natifs de nombreux utilitaires Unix courants. Il y a une touchcommande à l'intérieur.

Greg Hewgill
la source
6
Comme presque tous les ports unix-to-windows, cela ne fonctionne pas avec les caractères unicode dans les noms de fichiers en dehors du jeu de codage défini comme valeur par défaut pour les programmes non-unicode. Testez le nom de fichier qui fera trébucher tous ces outils:"test тест τεστ.txt"
RomanSt le
gnuwin32 l'a. mais en effet, gnuwin32 échoue également pour les caractères unicode.
barlop
1
Mise à jour à partir de 2017 Sous Windows 10, nous pouvons utiliser le sous-système Linux pour Windows, qui installe bash. Pas besoin de cygwin, MinGW, unxutils ou de tout autre unix partiel aux ports Windows. docs.microsoft.com/fr-fr/windows/wsl/install-win10
Davos
@Davos avez-vous essayé cela sur un fichier autre que votre contexte utilisateur (généralement sans privilège)? Car techniquement, le côté utilisateur de LXSS s’exécute en tant qu’utilisateur non privilégié.
0xC0000022L
@ 0xC0000022L ne sais pas ce que vous voulez dire dans le contexte de la touchcommande. C'est comme n'importe quoi d'autre dans les environnements nix, vous pouvez le faire ou le poursuivre, ou vous ne pouvez pas le faire parce que vous n'avez pas de privilèges.
Davos
96

Si tout ce que vous voulez, c'est changer la date de la dernière modification du fichier (ce qui était mon cas):

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date
ThiagoAlves
la source
9
PowerShell FTW. Sérieusement, unix est cool mais PS est plus cool.
Mat
1
Vous pouvez également mettre à jour la dernière écriture de plusieurs fichiers / dossiers
12
Cela ne fonctionnera que sur un seul fichier. Pour plusieurs fichiers: ls * | Objet ForEach {$ _. LastWriteTime = Get-Date}
Eli Algranti,
2
Si vous voulez le faire récursivement, cela fonctionne plutôt bien: gci -recu -inc " . " | % {$ _. LastWriteTime = Get-Date}
BrainSlugs83 le
6
@ BrainSlugs83: utiliser les backticks `pour le code:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix le
58
type nul >>file & copy file +,,
  • Crée files'il n'existe pas.
  • Laisse le contenu du fichier seul.
  • Utilise juste les éléments cmdintégrés.
  • Le dernier accès et les heures de création sont mis à jour.

MISE À JOUR

Gah! Cela ne fonctionne pas sur les fichiers en lecture seule, alors que touchsi. Je suggère:

:touch
if not exist "%~1" type nul >>"%~1"& goto :eof
set _ATTRIBUTES=%~a1
if "%~a1"=="%_ATTRIBUTES:r=%" (copy "%~1"+,,) else attrib -r "%~1" & copy "%~1"+,, & attrib +r "%~1"
Bobbogo
la source
Dommage que copy ne puisse pas ignorer l'attribut + r comme xcopy. Dommage que xcopy ne prenne pas en charge la filename +,,syntaxe bizarre .
Abel
Malheureusement, cela ne fonctionne pas (du moins pas sous Windows 7). Il semble que l'interpréteur de commande ne mette pas à jour l'horodatage de la destination d'une redirection si le fichier n'est pas réellement modifié (c'est-à-dire qu'il n'y a pas de données à rediriger).
Synetech
32

@ dash-tom-bang:

Voici l'explication de Technet sur le mystérieux '+' et les virgules:

copie / b Source + ,,

Les virgules indiquent l'omission du paramètre Destination.

La commande copy prend en charge la fusion de plusieurs fichiers en un seul fichier de destination. Comme une destination vide ne peut pas être spécifiée à l'aide d'un caractère d'espacement à l'invite de commande, vous pouvez utiliser deux virgules pour le signaler.

Et voici la référence aux commandes de copie de Technet: http://technet.microsoft.com/en-us/library/bb490886.aspx

Faredoon
la source
16
Maintenant, c'est juste la syntaxe foirée. Sérieusement, à quoi pensaient-ils? Notez également que la même documentation indique "Destination: Obligatoire." ... Je suis émerveillé.
Sth
1
Cela ne semble même pas fonctionner sous Vista ... Je me demande s'ils sont revenus à la raison?
quillbreaker
1
Fonctionne dans Windows 7
Imran
5
Cela a fonctionné pour moi même sans virgule: copier fichier.ext + Ainsi, la documentation est aussi éloignée du comportement réel que le comportement de toute attente raisonnable.
Abgan
2
Cela fonctionnait sous Windows Server 2008 mais seulement si vous vous trouvez dans le dossier contenant le fichier
FrinkTheBrave 12/12
21

voici une version récursive utilisant powershell ... cela changera la dernière heure de modification pour tous les fichiers et sous-répertoires, et les fichiers dans les sous-répertoires de ce répertoire

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}
Roger
la source
2
Moins verbeux mais n'utilisant encore que des raccourcis Powershell standard:ls * -recurse | % { $_.LastWriteTime = Get-Date }
Jonas
15

Le projet GnuWin32 possède les ports Windows des versions Gnu des utilitaires de ligne de commande Unix.

Il se présente sous forme de plusieurs packages distincts et vous pouvez installer uniquement les commandes dont vous avez besoin, sans autres dépendances. Car touchvous auriez besoin du paquet CoreUtils .

Dave Webb
la source
15

cygwinvient avec touch. Je sais que vous avez indiqué que vous ne souhaitiez pas installer un cadre complet, mais cygwin est assez léger et peut être appelé à partir de la fenêtre de commande dos sans que la ligne de commande de type Unix ne soit activée.

Vous pouvez également contrôler les outils à installer pour pouvoir simplement installer le touch.exefichier et quitter le reste de la structure.

serg10
la source
2
Pour ce qui vous concerne ici, tout ce dont vous avez besoin d'installer est le fichier touch.exe et le fichier cygwin.dll dans un répertoire pour utiliser l'outil. Il n'y a pas d'autres dépendances relatives à l'utilisation d'outils basés sur cygwin.
Tall Jeff
1
Quand j'essaye cela (win7x64), j'ai besoin de 4 dll cygwin en plus de touch.exe: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
matt wilkie
15

J'ai essayé de créer un fichier vide dans mon script batch. Vous pouvez utiliser ceci:

ECHO text>file1.txt
pkm
la source
3
C'est de loin la meilleure méthode rapide .. Je avais juste besoin de créer un fichier .gitignore et Windows 7 continue se plaindre « doit entrer un nom de fichier » etc etc echo pie>.gitignoretravaillé un régal - merci!
4
@Alex Ceci n'est pas lié, mais cette erreur Windows est due au fait que le fichier commence par un point. Il existe un étrange hack pour contourner cela dans l'Explorateur Windows: faire en sorte que le fichier se termine par un point également. Donc, tapez .gitignore.et lorsque vous appuyez sur Entrée, Windows supprime la période de fin. Fou, mais ça marche.
Brad Cupit
1
J'espère que je pourrais donner assez de votes positifs pour attirer l'attention des gros joueurs en popularité.
Jonathan Mee
1
Cela ne crée cependant pas de fichier vide, fichier1.txt contient "texte".
Joshua Meyers
14

Voici un fichier de configuration simple que j'ai écrit pour ajouter un clic droit "toucher" dans l'explorateur Windows . Ce serait facile de le script aussi, puisqu'il appelle simplement:

cmd.exe /c copy %1+nul %1 /by
Jon Galloway
la source
Et n'oubliez pas copy nul some_filede créer un fichier vide (ce que je vois le touchplus souvent utilisé).
Joey
Ack! Fichier zip inaccessible (quelque chose à propos de brinkster22.com qui doit être le site référant). Jon, tu peux mettre ça à jour?
Dan7119
Fonctionne sur Win7. Ne fonctionne pas sous WinXP: la durée du fichier reste la même après l'exécution de "copy".
Egor Skriptunoff
11

Essayez celui-ci de CodeProject .

  • Pas besoin d'installer.
  • Si vous le souhaitez, vous pouvez même modifier la source.
Prakash
la source
2
Bien que ce lien puisse répondre à la question, il est préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence. Les réponses avec lien uniquement peuvent devenir non valides si la page liée est modifiée.
Yan Sklyarenko
9

Vous pouvez également installer Cygwin, qui vous donne le toucher, ainsi qu'une pléthore d'autres commandes * NIX.

Jamesaharvey
la source
2
ne peut pas vivre sur les fenêtres sans cygwin.
jweede
Et cygwin sans menthe est assez boiteux.
Ahe
5

D'une question similaire sur Stack Overflow.

Pour mettre à jour les horodatages (en ignorant les autres fonctionnalités de touch), je choisirais:

copy /b filename.ext +,,
Dennis Williamson
la source
1
Ceci est une répétition de la réponse de Gish Domains de 2 ans auparavant, sans explication.
Fix1234
4

sur le site:

Funduc Software Touch est un utilitaire «tactile» gratuit qui vous permet de modifier les tampons heure / date et / ou attribut sur un ou plusieurs fichiers. En outre, FS Touch peut ajouter / soustraire un nombre spécifié de secondes à partir de la durée du fichier existant. Vous pouvez spécifier le ou les fichiers et / ou sous-répertoires à modifier via des "masques de fichiers complexes". Le programme peut être exécuté de manière interactive ou à partir de la ligne de commande. La nouveauté de la version 7.2 est un commutateur de ligne de commande permettant de modifier l’horodatage du fichier modifié +/- le nombre de secondes spécifié.

FS Touch fonctionne sous Windows XP, Vista, Windows 7 et Windows 8.


la source
4

Ce contenu peut être enregistré dans un fichier reg. Cela ajoutera un menu contextuel par clic droit pour tous les fichiers dotés de la fonction "Touch File" (testé sur Windows 7). Copiez toutes les lignes suivantes dans le fichier reg. Exécutez le fichier et approuvez la question. Faites un clic droit sur n’importe quel fichier (ou plusieurs fichiers) - L’option "Touch File" est maintenant disponible.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\Touch File]

[HKEY_CLASSES_ROOT\*\shell\Touch File\command]
@="cmd /C copy /b \"%1\" +,,"

la source
3

Si vous utilisez git pour un ou plusieurs projets, la commande mingw basée git-bashpour Windows a la touchcommande. Je tiens à remercier @ greg-hewgill de m'avoir signalé que des utilitaires nix existent pour Windows, car c’est ce qui m’a donné l’idée d’essayer de toucher à git-bash.

Superole
la source
3

Dans PowerShell, essayez:

ni fileName.txt

NIest un alias de la cmdlet New-Item .

Twisty
la source
1
Bienvenue sur SuperUser. Merci d'avoir posté! Pouvez-vous ajouter un lien vers un site Web fournissant plus d'informations sur la nicommande, et peut-être décrire davantage le rôle de la commande?
hBy2Py
1
La New-Itemcmdlet ne peut pas être utilisée pour mettre à jour l'horodatage d'un fichier existant.
Twisty Impersonator
Bien qu'il ne mette pas à jour l'horodatage, il crée un nouveau fichier, c'est ce que fait Touch. +1 de moi.
MikeMurko
2

Enregistrez ce qui suit sous le nom touch.bat dans votre dossier% windir% \ system32 ou ajoutez le dossier dans lequel il est enregistré dans votre variable d’environnement PATH:

@echo off
if %1.==. goto end
if not exist %1 goto end
copy /b %1 +,, > nul
echo %1 touched!
:end

Exemple d'utilisation:

touch *.cpp
touch somefile.c

Référence: Microsoft KB 69581

Tim Partridge
la source
Excellent! Pas de matériel externe, il suffit de copier. Et bien sûr, la plupart d'entre nous en ont besoin en tant que strip-tease :)
Bogdan Gavril MSFT
2

J'ai trouvé un moyen rapide de le faire si vim est installé (pas génial pour les gros fichiers, ouvrira tout le fichier puis le fermera ...)

vim foobar.txt +wq!

Le "+" définit l'argument pour exécuter les commandes suivantes. "wq!" est "écris, quitte, force". Cela ouvrira le fichier, fera une sauvegarde, puis le fermera immédiatement après.

Jason
la source
Inutilement complexe, volumineux et non portable. -1
MD XF
2

Je voulais la fonctionnalité 'tactile' de clonage / duplication du fichier date d'un autre fichier, de manière native, et utilisable depuis un fichier batch.

Donc, faites glisser le fichier vidéo dans un fichier batch, FFMPEG s'exécute, puis la date de création et la date de modification du fichier d'entrée sont copiées dans le fichier de sortie.

Cela semblait simple au début, jusqu'à ce que vous constatiez que les fichiers de traitement par lots gâchent le traitement des noms de fichiers Unicode, que PowerShell en ligne se mêle aux symboles de nom de fichier et que leur échapper est un cauchemar.

Ma solution a été de faire de la partie tactile un script PowerShell distinct que j’ai appelé "CLONE-FILE-DATE.ps1" et qui contient:

param
(
  [Parameter(Mandatory=$true)][string]$SourcePath,
  [Parameter(Mandatory=$true)][string]$TargetPath
)

(GI -LiteralPath $TargetPath).CreationTime  = (GI -LiteralPath $SourcePath).CreationTime
(GI -LiteralPath $TargetPath).LastWriteTime = (GI -LiteralPath $SourcePath).LastWriteTime

Ensuite, voici un exemple d'utilisation dans mon fichier de commandes 'CONVERT.BAT':

%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"

CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"

Je pense que le PowerShell est lisible, alors expliquons simplement le lot:

% ~ dp0 est le répertoire actuel du fichier de commandes.

% ~ 1 est le chemin du fichier déposé dans le lot sans guillemets.

CHCP 65001> nul définit les caractères sur UTF-8 et avale la sortie.

-ExecutionPolicy ByPass vous permet d'exécuter PowerShell sans avoir à modifier la stratégie globale, qui permet d'éviter que des personnes n'exécutent des scripts par inadvertance.

WhoIsRich
la source
1

Essayer

fichier fsutil createnew new.txt 0


la source
2
The FSUTIL utility requires that you have administrative privileges.- et cela ne se comporte pas comme touchpour les fichiers existants.
Keith Thompson
1

Les cinq alternatives mentionnées ci-dessus, plus trois autres non mentionnées ici, peuvent être trouvées dans SuperUser: "Windows Recursive Touch Command"

JdeBP
la source
2
Bien que ce lien puisse répondre à la question, il est préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence. Les réponses avec lien uniquement peuvent devenir non valides si la page liée est modifiée.
Yan Sklyarenko
1

Eh bien, si vous voulez vraiment avoir la touchcommande disponible, vous pouvez le mettre dans un fichier batch appelé touch.batet le coller dans C:\Windows:

TYPE NUL >>%1

Assez simple.

MD XF
la source
Cette méthode ne met pas à jour l'heure modifiée sur les plates-formes suivantes: Windows Server 2012 R2, Windows Server 2016, Windows 10
Nate le
0

Les gens d'Unix ont résolu le problème général de la mise à jour de la date d'un fichier avec la commande touch . Cependant, pour Windows, une méthode plus simple est parfois possible pour des cas particuliers.

Je dois mettre à jour l'horodatage d'un raccourci d'application dans Windows 8.1 afin d'apporter des modifications à la couleur d'arrière-plan de la mosaïque d'application, reportez -vous à la question relative aux SO . Plutôt que de mettre en œuvre l'un des outils intelligents ci-dessus, je trouve plus facile de modifier le champ de commentaire du raccourci. La plupart des gens laissent ce champ vide, mais bien sûr, un commentaire utile est rapidement conçu. Et si un commentaire existe, ajouter ou supprimer une période finale ne nuit jamais.

Roland
la source
0

J'apprécie que c'est une vieille question, je viens de découvrir tactile sur mon système Windows 10. J'ai téléchargé et installé Git à partir d' ici (je pense) et il semble que touch et divers autres utilitaires sont dans le dossier bin.

0909EM
la source