web-dev-qa-db-fra.com

Quelles sont les utilisations légitimes de la commande `touch`?

Quel est l'intérêt de la commande touch? Je sais que je peux créer des fichiers vides avec, mais c'est aussi le cas avec 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).

82
Quora Feans

Un des avantages de touch est qu'il peut spécifier des horodatages arbitraires, tandis que echo -n donnera toujours l'heure actuelle.

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

D'autres utilisations consistent à créer des fichiers qui fonctionnent uniquement en fonction de leur existence, par exemple /etc/nologin, qui interdit les connexions s'il existe. Je dirais également que touch myfile est une construction plus simple que echo -n >> myfile, en plus d'être plus court à taper.

97
casey

L'appel système sous-jacent (utime) est important pour divers utilitaires comme tar pour pouvoir définir les horodatages d'un fichier nouvellement copié (non taré). Certains utilitaires de sauvegarde peuvent également être optionnés pour réinitialiser la dernière heure d'accès aux fichiers qu'ils ont copiés.

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

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +
39
JRFerguson

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

Exemples

1. création de 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: Le total 0 sortie de ls -l est correct. Cette implémentation de ls indique le nombre de blocs utilisés par les fichiers lorsqu'ils sont répertoriés. Vous pouvez vous en assurer en ajoutant le -s basculez sur ls. Cela répertoriera les blocs utilisés par chaque fichier. Ici, j'ai ajouté 2 caractères au fichier1 et au fichier2.

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. informations 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 touch pour manipuler les différents horodatages 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 modifier l'heure

$ 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é à l'aide de touch. Cela suit le moment où l'une des métadonnées a été touchée dans le fichier. Voir ce Q&A U&L pour plus de détails, intitulé: Que pouvez-vous faire à un fichier sans déclencher l'horodatage "Modifier"? .

38
slm

L'une des utilisations les plus courantes de touch est - ou du moins était - pour déclencher une reconstruction de code.

Les outils de construction habituels - make et ses dérivés - essaient d'économiser du travail en ne recompilant/reconstruisant les fichiers que si l'un des fichiers qui a servi à les créer a changé - par exemple, si un fichier .o est plus récente que la source .c, 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 la reconstruction de quelque chose. Vous pouvez apporter une modification inutile à l'un de ses fichiers source, mais cela risque d'endommager accidentellement quelque chose. Au lieu de cela, vous pouvez simplement touch le fichier, le faire paraître nouveau sans aucun risque de modifier son contenu - et ce serait suffisant pour convaincre make qu'il était temps de reconstruire tout ce qui dépend de ce fichier.

Il existe d'autres utilisations, mais historiquement, c'était la plus importante.

20
keshlam

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

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

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

L'impression sur l'âge du fichier est désormais fausse, mais son sens est réel et légitime.

20
LSerni

J'ai travaillé avec au moins un framework web (je ne me souviens pas lequel) qui en mode développement a regardé les fichiers de code source pour les modifications et rechargé l'application lorsque cela s'est produit.

Bien sûr, parfois, vous vouliez qu'il se recharge après avoir changé quelque chose qu'il ne regardait pas, auquel cas touching son 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 réellement modifier le fichier.

12
millimoose

Utilisation légitime du toucher:

  • Mettez à jour l'horodatage des fichiers image (GIF/JPG/etc) à l'heure à laquelle ils ont été pris. Tous les moteurs de rendu ne lisent pas ou ne tiennent pas compte des informations EXIF.
  • Gardez le temps c/m 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'est-à-dire CSV) si vous devez effectuer une autre importation après un échec, et le programme d'importation dépend de l'horodatage (laissez cette discussion à un autre sujet :-))
  • À des fins d'archivage, c'est-à-dire avoir des sauvegardes dans les dossiers en fonction de l'année, puis régler l'heure de ces dossiers au 1er janvier AAAA pour un tri facile
11
sastorsl

L'une des utilisations consiste à corriger l'horodatage d'un fichier mal défini.

Par exemple, la plupart des façons dont vous copiez un fichier (et pour certaines manières de déplacer un fichier) entraînent que le nouveau fichier ait un horodatage de l'heure actuelle, plutôt que l'horodatage du fichier d'origine.

Habituellement, ce n'est pas ce que l'on souhaite. Le toucher peut "corriger" cela.

Une autre utilisation consiste à refléter une modification de fichier qui a été annulée en rétablissant l'horodatage du fichier à ce qu'il était avant les opérations "modifier ... annuler-modifier".

7
Kevin Fegan

Une différence importante par rapport à things comme echo (ou encore mieux > file comme mentionné par d'autres) est que le toucher n'écrasera pas le contenu. > file videra un fichier. touch ne le sera pas. Au lieu de penser à des astuces pour éviter d'endommager le contenu, utilisez simplement le toucher! Il fera de toute façon moins de travail dans le noyau, car il ne fonctionnera qu'avec les attributs du fichier sans perdre de temps à préparer réellement une ouverture puis à effectuer une fermeture.

Touch peut probablement modifier l'horodatage même si le fichier est actuellement sous un verrou obligatoire ou consultatif, ou une ouverture exclusive. Hmmm, je n'ai jamais testé ça ou lu à ce sujet ...

5
user56373

En voici un - j'utilise un logiciel appelé SageTV pour enregistrer des émissions de télévision - ceux-ci sont souvent enregistrés en MPEG-2 qui n'est pas un codec très efficace, il n'est pas non plus compatible avec iPad/iPhone. 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 au début de l'émission télévisée - sinon il fausse la chronologie de l'émission de sorte qu'il n'est pas facile de FF ou REW. Par conséquent, j'utilise tactile pour réinitialiser l'horodatage du fichier .mp4 pour qu'il soit le même que le fichier d'origine.
Est-ce légitime?

4
Wayner

Au travail, nous avons une archive de cartes numériques datant de plus de 15 ans. Ces anciennes cartes sont enregistrées dans une variété de 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 différents formats, nous créons des versions jpeg des cartes, puis utilisons la touche tactile pour que le fichier jpeg corresponde à l'horodatage du fichier source d'origine - souvent des années après la création de l'original.

Maintenant, nous pouvons utiliser un seul programme tel que Picasa pour voir toute la bibliothèque et localiser trivialement certaines plages de dates. Sans toucher, nous devons ajouter des métadonnées de date pour chaque image, probablement manuellement, puis rechercher ces chaînes lorsque vous recherchez une plage de dates spécifique.

2
matt wilkie

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

2
user56560

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

S'il y a une situation où vous ne voulez pas changer la configuration mais voulez forcer le rechargement, touchez vous aide ici.

1
Nils

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 une utilisation sur une page Web. Si je dois en modifier un, il changera sa date. J'ai envisagé touch de les réinitialiser.

1
TecBrat

J'ai un travail cron qui obtient les modifications d'une base de données qui se sont produites entre la dernière exécution du travail et l'exécution actuelle. Il produit un fichier XML des modifications qui sont ensuite traitées dans une base de données différente. Il obtient la dernière exécution de l'horodatage sur le fichier de sortie XML. *

Si quelque chose se passe mal dans le traitement du fichier XML, je pourrais vouloir répéter l'exécution à partir de la date d'origine et non de la date mentionnée sur l'horodatage du nouveau fichier XML.

La façon la plus simple de le faire, plutôt que de modifier les scripts appelés etc., est de toucher le fichier XML et de forcer l'horodatage à la date dont j'ai besoin.

De plus, si je recommence (sans aucun fichier de sortie XML précédent), je peux simplement simuler son existence en utilisant le toucher.

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

0
Geeb