Quels sont les usages légitimes de la commande `touch`?

83

Quel est le point de la touchcommande? Je sais que je peux créer des fichiers vides avec, mais il en va de même pour echo -n.

Sinon, pourquoi quelqu'un aurait-il besoin de modifier les horodatages d'un fichier? À moins de créer une fausse impression sur l'âge d'un fichier, je ne vois aucune autre utilisation, et celle-ci n'est pas légitime (de mon point de vue).

Quora Feans
la source
15
au lieu de echo -n > filename, vous pouvez exécuter les >filename
logiciels
77
Quels sont les usages illégitimes ?
bmargulies
10
Unless to create the false impression about the age of a file. Pas nécessaire fausse impression. Que faire si vous voulez changer l'heure de modification? Cela peut être utile dans les scripts. Ce script dépend fortement de la touchcommande et il est très pratique et simple de l’avoir comme ça.
VL-80
7
Pensez à ce que font tar(ou à d’autres archiveurs) quand ils extraient une archive. Généralement, ils définissent l'heure de modification du fichier sur l'heure de l'archive, et non sur l'heure à laquelle l'archive a été extraite, ce qui est une fonctionnalité souhaitable. Puisqu'il est légitime pour un programme en mode utilisateur de créer de faux horodatages, l'argument qui explique pourquoi touch(ou un autre programme de ligne de commande) ne devrait pas l'autoriser en fonction d'un argument de ligne de commande. L'apprentissage de C ne vous rend pas plus légitime que celui qui écrit un shscript ;-)
Steve Jessop
5
Sous Unix, il n’existe pas d’horodatage décrivant le agefichier. Ce serait un creationhorodatage et cet horodatage n'existe pas pour les fichiers unix.
Kevin Fegan

Réponses:

98

Un des avantages touchest qu'il peut spécifier des horodatages arbitraires, tout echo -nen ayant toujours pour résultat l'heure actuelle.

Un exemple d'utilisation légitime consiste à mettre à jour l'horodatage d'un fichier de code source afin qu'un programme similaire makeconsidère le fichier source plus récent que son objet compilé et le reconstruise.

D'autres utilisations consistent à créer des fichiers fonctionnant uniquement en fonction de leur existence, par exemple /etc/nologin, ce qui interdit les connexions, le cas échéant. Je dirais aussi que touch myfilec'est une construction plus simple que echo -n >> myfile, tout en étant plus courte à taper.

casey
la source
18
une autre utilisation courante: touchez un fichier à une date spécifique, puis "trouver / -newer / le / fichier" pour trouver tous les fichiers modifiés / créés après
Olivier Dulac
@casey Quand j'ai vérifié la documentation de, echo -nje vois qu'il est écrit "ne pas afficher le retour à la ligne final". Donc, je ne vois pas comment cela peut créer un fichier vide. Pouvez-vous clarifier s'il vous plaît?
Geek
3
@ Geek echo -naffichera une chaîne vide et ne fera rien en soi. En redirigeant sa sortie via >>, la sortie vide est ajoutée à un fichier. La redirection entraînera la création du fichier s'il n'existe pas.
casey
6
Cela ne fonctionne pas: ouvrir un fichier existant pour la sortie, mais ne pas l'écrire, ne change pas le mtime (de toute façon sur mon système). Même si c'était le cas, vous n'avez pas besoin et ne devriez pas utiliser echo -npour une commande qui ne fait rien. echo -npeut sortir la chaîne "-n" sous certains shells. Si vous avez vraiment besoin d’une commande qui ne fait rien :ou qui truesoit une meilleure option, >> myfilec’est aussi un moyen parfaitement valide de créer le fichier s’il n’existe pas. Bien entendu, tout cela conforte votre réponse selon laquelle vous devriez simplement utiliser "tactile".
hvd
40

L'appel système sous-jacent ( utime) est important pour divers utilitaires, comme tarpouvoir définir les horodatages d'un fichier récemment copié (non taré). Certains utilitaires de sauvegarde peuvent également avoir la possibilité de réinitialiser le dernier accès des fichiers qu'ils ont copiés.

Une utilisation légitime de touchconsiste à créer un fichier avec un horodatage particulier. Un tel fichier "référence" peut ensuite être utilisé par des commandes telles que find. Par exemple, pour trouver tous les fichiers plus récemment modifiés que le 1er novembre 2013 (c.-à-d. 2013/11/01) "

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +
JRFerguson
la source
Comment calculer cela 201311010000 signifie que 1 novembre 2013? Existe-t-il un utilitaire qui me le dira? En d'autres termes, comment puis-je déterminer l'entrée à toucher?
Geek
4
@ Geek En regardant le nombre et en notant que la première partie, 20131101peut être décomposée en 2013-11-01, ou le 1er novembre 2013. Vous pouvez alors supposer que la 0000partie indique une heure spécifique de la journée, dans ce cas 00 heures, 00 minutes. Ou vous pouvez simplement regarder la page de manuel pour touch, qui vous dit exactement quel est le format (voir -t).
JAB
@ Geek Les pages de manuel sont votre ami :-)
JRFerguson le
39

Le touchbut principal de la commande est de manipuler les horodatages des fichiers et de créer des fichiers.

Exemples

1. créer des fichiers

$ ls -l
total 0

$ touch file{1..3}

$ ls -l
total 0
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file1
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file2
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file3

Remarque: la total 0sortie de ls -lest correcte. Cette implémentation de lsaffiche le nombre de blocs utilisés par les fichiers lorsqu'ils sont répertoriés. Vous pouvez vous assurer de ce fait en ajoutant le -scommutateur à ls. Ceci listera les blocs utilisés par chaque fichier. Ici, j'ai ajouté 2 caractères à file1 & file2.

Exemple

$ ls -ls
total 8
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:07 file1
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:09 file2
0 -rw-rw-r--. 1 saml saml 0 Jan 13 12:05 file3

2. info heure / date d'un fichier - commande stat

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-01-12 13:33:38.279456149 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:33:38.279456149 -0500
 Birth: -

Nous pouvons utiliser touchpour manipuler les différents timestamps sur un fichier donné.

3. extrait de la page de manuel tactile

   -a     change only the access time
   -m     change only the modification time
   -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

4. manipuler le temps d'accès

$ touch -a -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:38:52.023434696 -0500
 Birth: -

5. manipuler le temps de modification

$ touch -m -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2000-01-01 00:00:00.000000000 -0500
Change: 2014-01-12 13:39:31.060432026 -0500
 Birth: -

Vous vous demandez peut-être l'heure de changement (ctime). Cela ne peut pas être manipulé en utilisant touch. Cela suit l'heure à laquelle l'une des métadonnées a été touchée dans le fichier. Voir ce Q & A de U & L pour plus de détails, intitulé: Que pouvez-vous faire pour un fichier sans déclencher l'horodatage "Modifier"? .

slm
la source
@sim: ma question implique que je sache que le toucher sert à modifier les horodatages. Je voulais juste savoir pourquoi un utilisateur honnête voudrait cela. Si ce n’était pas la partie ctime de votre réponse, je vous aurais donné -1.
Quora Feans
16
@QuoraFea - Ma réponse est pour votre bénéfice et pour tout utilisateur qui l'aura jamais rencontré à l'avenir. S'il vous plaît, ne présumez pas qu'une réponse est purement dans votre intérêt et je suis désolée si je vous ai offensé de quelque manière que ce soit, ce n'était pas mon intention, je voulais simplement expliquer le fondement du fonctionnement du temps.
slm
@sim: Je ne suis pas offensé, je pensais juste que la réponse n'allait pas dans la bonne direction. Quoi qu'il en soit, merci pour cette réponse.
Quora Feans
@QuoraFea - de rien, et merci pour votre Q. Ils sont appréciés!
slm
1
@ Geek - essayez les commandes. La sortie est correcte ls -ldans un répertoire où les fichiers ont une taille de 0, et rien d’autre n’existe encore. Dès que vous donnez une des tailles de fichiers, le total s'affichera avec la quantité de blocs utilisés par les fichiers. Voir mes mises à jour si vous n'êtes pas sûr, j'ai ajouté un exemple.
slm
20

Outre les deux autres très bonnes réponses que vous avez obtenues, un autre usage est, selon vos mots, de

créer la fausse impression sur l'âge d'un fichier

par exemple pour une utilisation dans des schémas de sauvegarde . Vous voudrez peut-être ne pas mettre à jour une sauvegarde avec une nouvelle, car elles sont identiques ou que les modifications ne sont pas pertinentes par rapport au coût de la mise à jour d'une sauvegarde sur une ligne lente vers un hôte distant, par exemple. Pour ce faire, vous avez la possibilité simple de marquer le fichier de sauvegarde avec un horodatage plus récent, sans simuler, mais en déclarant que l'horodatage de validité de ce fichier est maintenant différent.

L'impression concernant l'âge du fichier est maintenant bien fausse, mais sa signification est réelle et légitime.

LSerni
la source
20

L'une des utilisations les plus courantes de touch- ou du moins de l'habitude d'être - est de déclencher une reconstruction du code.

Les outils de construction habituels - makeet leurs dérivés - essaient de sauvegarder le travail en ne recompilant / reconstruisant pas les fichiers, sauf si l’un des fichiers qui a été créé a été modifié - par exemple, si un fichier .o est plus récent que le .c source, il est généralement prudent de supposer que la source C n’a pas été modifiée depuis sa compilation pour produire ce fichier objet.

Mais il y a des moments où vous voulez forcer quelque chose à être reconstruit. Vous pourriez apporter une modification inutile à l'un de ses fichiers source, mais cela risquerait d'endommager accidentellement quelque chose. Au lieu de cela, vous pouvez simplement touchcréer un fichier, le rendre nouveau sans risquer de modifier son contenu, ce qui suffirait à convaincre makequ'il est temps de reconstruire tout ce qui dépend de ce fichier.

Il y a d'autres utilisations, mais historiquement, c'était le plus important.

Keshlam
la source
Bien qu'il semble judicieux de modifier un fichier pour provoquer une reconstruction, je suis contre. Certains systèmes de révision de code source peuvent être perturbés par un fichier modifié. Donc, touchc'est aussi mauvais qu'un changement manuel. Pour provoquer une reconstruction, je suggère de supprimer les fichiers .ode sortie de la source en question.
harper
1
Les modifications manuelles et la suppression des fichiers .o nécessitent toutes deux plus de temps et de frappe, et une modification manuelle est beaucoup plus sujette aux erreurs. Et nous ne parlons que de la modification de l'horodatage sur une copie de travail - si des modifications sont apportées ultérieurement, le fichier reflétera correctement l'horodatage des modifications. Et tous les systèmes de contrôle de version ne sont pas confondus avec un horodatage.
David
1
Comme l'a dit David. C'était vraiment la pratique Unix standard il n'y a pas si longtemps, et cela reste toujours la pratique standard pour les développeurs travaillant en dehors des IDE.
Keshlam
12

J'ai travaillé avec au moins un framework Web (je ne me souviens plus lequel) qui, en mode de développement, surveillait les fichiers de code source à la recherche de modifications et rechargeait l'application lorsque cela se produisait.

Bien sûr, parfois, vous vouliez qu'il soit rechargé après avoir changé quelque chose qu'il ne regardait pas, auquel cas touchson fichier de configuration principal a fait l'affaire.

Ainsi, dans le cas général, chaque fois que vous souhaitez démarrer un processus déclenché par des modifications apportées à un fichier, sans modifier réellement le fichier.

millimoose
la source
4
C'est en fait le cas avec mod_wsgi et apache; vous pouvez recharger, par exemple, une application Web Django en touchant simplement le fichier wsgi.
sapi
11

Utilisation légitime du toucher:

  • Mettez à jour l'horodatage des fichiers d'image (GIF / JPG / etc.) à l'heure à laquelle ils ont été pris. Tous les rendus ne lisent pas ou ne tiennent pas compte des informations EXIF.
  • Conservez le c / m-time lors de la mise à jour en masse d'un ensemble de fichiers où l'horodatage est important pour l'ensemble de fichiers.
  • Définissez l'heure d'un fichier batch (c.-à-d. CSV) si vous devez effectuer une autre importation après un échec et que le programme d'importation dépend de l'horodatage (laissez cette discussion dans un autre sujet :-))
  • Pour des raisons d'archivage, c.-à-d. Avoir des sauvegardes dans des dossiers en fonction de l'année, puis régler l'heure de ces dossiers sur 1 janvier pour un tri facile
sastorsl
la source
7

Une utilisation consiste à corriger l'horodatage d'un fichier mal défini.

Par exemple, dans la plupart des cas, vous copiez un fichier (et dans certains cas, vous pouvez déplacer un fichier), le nouveau fichier ayant un horodatage de l'heure actuelle, plutôt que l'horodatage du fichier d'origine.

Habituellement, ce n'est pas ce qui est souhaité. Touch peut "réparer" ça.

Une autre utilisation consiste à refléter une modification de fichier qui a été annulée en restaurant l'horodatage du fichier tel qu'il était avant les opérations "edit ... undo-edit".

Kevin Fegan
la source
2
En effet. Le temps que j'ai trouvé alias cp='cp --preserve=timestamps'me convient mieux pour PC Land…
Runium,
5

Une différence importante par rapport à thingsj'aime echo(ou même au meilleur > filecomme mentionné par d'autres) est que le toucher ne brisera pas le contenu. > fileva vider un fichier. touchNe fera pas. Au lieu de penser à des astuces pour éviter d’endommager le contenu, utilisez simplement le toucher! Quoi qu'il en soit, cela fera moins de travail dans le noyau, car cela ne fonctionnera qu'avec les attributs du fichier sans perdre de temps à préparer réellement un fichier ouvert puis à le fermer.

Touch peut probablement modifier l'horodatage, même si le fichier est actuellement verrouillé de manière obligatoire ou facultative, ou s'il est ouvert de manière exclusive. Hmmm, je n'ai jamais testé ou lu à ce sujet ...


la source
2
>>ajoutera au lieu de remplacer
Michael Mrozek
J'ai envisagé de mentionner cela, mais cela va encore plus en territoire à effets secondaires. Vous devriez également mentionner le fait que cela jetterait une erreur si le fichier était déjà ouvert en exclusivité, etc. etc. Un problème qui pourrait s'appliquer avec l'utilisation de> aussi. Mon deuxième argument - au-delà du point principal, à savoir qu'il est légèrement plus rapide de toucher aux statistiques du fichier -, c'est que c'est une bonne idée d'écrire du code qui le dit bien, au lieu de tourner autour du pot.
4

En voici un - j’utilise un logiciel appelé SageTV pour enregistrer des émissions télévisées - celles-ci sont souvent enregistrées au format MPEG-2, qui n’est pas un codec très efficace, ni un iPad / iPhone convivial. Je convertis donc les fichiers en fichiers .mp4. Mais lors de la lecture des fichiers, SageTV s'attend à ce que l'horodatage du fichier soit celui du début de l'émission télévisée. Sinon, il bousille la chronologie de l'émission de sorte qu'il n'est pas facile de FF ou de REW. Par conséquent, j'utilise touch pour réinitialiser l'horodatage du fichier .mp4 afin qu'il soit identique à celui du fichier d'origine.
Est-ce légitime?

Wayner
la source
2

Souvent, vous pouvez avoir un processus qui change d’utilisateur, comme de la racine -> quelque chose d’autre. Touch peut vous donner la possibilité de créer un fichier dans un emplacement que seul root peut toucher avant que l'application ne commence à s'y connecter en tant qu'autre utilisateur.

utilisateur56560
la source
Ce n'est pas une utilisation du toucher impossible à "écho" - voir la question initiale de l'auteur
Domingo Ignacio Galdos le
Echo implique l'ouverture d'un flux et tel. Touch pourrait être hyper optimisé en travaillant directement avec les inodes. PERFORMANCE FTW!
user56560
2

Au travail, nous avons des archives de cartes numériques datant de plus de 15 ans. Ces anciennes cartes sont enregistrées dans divers formats tels que PostScript, EMF, PRN, hpgl2, pdf, etc. que la plupart des programmes ne comprennent pas. Ou vous avez besoin d'une douzaine de programmes différents pour les voir tous.

Pour faciliter la recherche et la navigation dans tous ces formats, nous créons des versions jpeg des cartes, puis utilisons touch pour que le fichier jpeg corresponde à l'horodatage du fichier source d'origine, souvent des années après sa création.

Nous pouvons maintenant utiliser un seul programme tel que Picasa pour voir l’ensemble de la bibliothèque et localiser de manière triviale certaines plages de dates. Sans toucher, nous devrions ajouter des métadonnées de date pour chaque image, probablement manuellement, puis rechercher ces chaînes lors de la recherche d'une plage de dates spécifique.

Matt Wilkie
la source
1

Je ne l'ai pas encore utilisé à cette fin, mais j'ai un script qui lit les fichiers et leurs dates dans un répertoire et les lit pour les utiliser sur une page Web. Si je dois en modifier un, sa date sera modifiée. Je leur ai touchdemandé de réinitialiser leur commande.

TecBrat
la source
1

Certains scripts d'initialisation comparent l'horodatage d'un fichier de configuration avec leur propre fichier pid. Le résultat décide s'il faut ou non recharger le service en cours d'exécution.

S'il existe une situation dans laquelle vous ne souhaitez pas modifier la configuration mais souhaitez forcer le rechargement, appuyez sur vous aide ici.

Nils
la source
0

J'ai un travail cron qui récupère les modifications d'une base de données survenues entre la dernière exécution du travail et l'exécution en cours. Il produit un fichier XML des modifications qui sont ensuite traitées dans une base de données différente. Il obtient l'heure de la dernière exécution à partir de l'horodatage du fichier de sortie XML. *

Si quelque chose ne va pas dans le traitement du fichier XML, je souhaiterais peut-être répéter l'exécution à partir de la date d'origine et non de la date indiquée sur l'horodatage du nouveau fichier XML.

Le moyen le plus simple de procéder, plutôt que de modifier les scripts appelés etc., consiste à toucher le fichier XML et à forcer l'horodatage à correspondre à la date dont j'ai besoin.

De plus, si je recommence (sans fichier de sortie XML précédent), je peux simplement simuler son existence à l'aide de la touche.

[*] Avant que quelqu'un le signale, je réalise que l'heure à laquelle le travail commence et que l'écriture du fichier XML laisse un intervalle de temps de quelques minutes où des modifications de la base de données pourraient survenir. Le travail s'exécute à un moment où les modifications de la base de données sont extrêmement improbables. C'est mon excuse et j'y tiens :-)

Geeb
la source