Was sind die legitimen Verwendungszwecke des Befehls "touch"?


83

Wozu dient der touchBefehl? Ich weiß, dass ich damit leere Dateien erstellen kann, aber so ist es auch mit echo -n.

Warum müsste sonst jemand die Zeitstempel einer Datei ändern? Sofern nicht der falsche Eindruck über das Alter einer Datei entsteht, sehe ich keine andere Verwendung, und diese ist (aus meiner Sicht) keine legitime.


15
Stattdessen echo -n > filenamekönnen Sie Folgendes >filename
ausführen

77
Was sind die illegitimen Verwendungen?
bmargulies

10
Unless to create the false impression about the age of a file. Kein notwendiger falscher Eindruck. Was ist, wenn Sie die Änderungszeit ändern möchten ? Es kann in Skripten nützlich sein. Dieses Skript hängt stark vom touchBefehl ab und es ist sehr bequem und einfach, es so zu haben.
VL-80,

7
Überlegen Sie, was tar(oder andere Dearchivierer) tun, wenn sie ein Archiv extrahieren. Im Allgemeinen wird die Änderungszeit der Datei auf die Zeit aus dem Archiv festgelegt, nicht auf die Zeit, zu der das Archiv extrahiert wurde. Dies ist eine wünschenswerte Funktion. Da es für ein Programm im Benutzermodus legitim ist, falsche Zeitstempel zu erstellen, gibt es nicht viele Argumente, warum touch(oder ein anderes Befehlszeilenprogramm) es nicht zulassen sollte, wenn es auf einem Befehlszeilenargument basiert. Wenn du C lernst, bist du nicht legitimer als jemand, der ein shDrehbuch schreibt ;-)
Steve Jessop

5
In Unix gibt es keinen Zeitstempel, der die ageeiner Datei beschreibt. Das wäre ein creationZeitstempel und es gibt keinen solchen Zeitstempel für Dateien in Unix.
Kevin Fegan

Antworten:


98

Ein Vorteil von touchist, dass beliebige Zeitstempel angegeben werden können, wobei echo -nimmer die aktuelle Zeit angezeigt wird.

Ein Beispiel für eine legitime Verwendung ist das Aktualisieren eines Zeitstempels einer Quellcodedatei, sodass ein Programm wie dieses makedie Quelldatei als neuer als ihr kompiliertes Objekt betrachtet und neu erstellt.

Andere Verwendungszwecke sind das Erstellen von Dateien, die ausschließlich auf der Grundlage ihrer Existenz funktionieren, z /etc/nologin. Ich würde auch behaupten, dass dies touch myfileein einfacheres Konstrukt ist als echo -n >> myfile, und dass es auch kürzer zu tippen ist.


18
Eine weitere häufige Verwendung: Berühren Sie eine Datei zu einem bestimmten Datum und dann "find / -newer / the / file", um alle danach geänderten / erstellten Dateien zu finden
Olivier Dulac

@casey Als ich die Dokumentation von überprüfte, stelle ich fest, echo -ndass dort steht "Keine nachgestellte Newline ausgeben". Also ich sehe nicht, wie das eine leere Datei erstellen kann. Können Sie bitte klären?
Geek

3
@Geek echo -ngibt eine leere Zeichenfolge aus und tut selbst nichts. Wenn Sie die Ausgabe über >>umleiten, wird die leere Ausgabe an eine Datei angehängt. Durch die Umleitung wird die Datei erstellt, wenn sie nicht vorhanden ist.
Casey

6
Das funktioniert nicht: Das Öffnen einer vorhandenen Datei für die Ausgabe, aber das Nichtschreiben, ändert die Zeit nicht (auf meinem System jedenfalls). Auch wenn dies der echo -nFall ist, müssen und sollten Sie keinen Befehl verwenden, der nichts bewirkt. echo -nkann die Zeichenfolge "-n" unter einigen Shells ausgeben. Wenn Sie wirklich einen Befehl benötigen, der nichts tut, :oder trueeine bessere Option sind, aber >> myfilefür sich genommen auch eine absolut gültige Methode zum Erstellen der Datei ist, wenn sie nicht vorhanden ist. All dies unterstützt natürlich Ihre Antwort, dass Sie nur "touch" verwenden sollten.
HDV

40

Der zugrunde liegende Systemaufruf ( utime) ist wichtig, damit verschiedene Dienstprogramme tardie Zeitstempel einer neu kopierten (nicht geteerten) Datei setzen können. Bei einigen Sicherungsprogrammen kann auch die Option zum Zurücksetzen des letzten Zugriffs auf kopierte Dateien gewählt werden.

Eine legitime Verwendung von touchist das Erstellen einer Datei mit einem bestimmten Zeitstempel. Eine solche "Referenz" -Datei kann dann von Befehlen wie verwendet werden find. Zum Beispiel, um alle Dateien zu finden, die vor kurzem geändert wurden als am 1. November 2013 (dh am 01.11.2013). "

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

Wie berechnet man das 201311010000 bedeutet Nov1,2013? Gibt es ein Dienstprogramm, das mir das sagt? Mit anderen Worten, wie bestimme ich die zu berührende Eingabe?
Geek

4
@Geek Wenn Sie sich die Nummer ansehen und feststellen, dass der erste Teil, 20131101in den 2013-11-01oder den 1. November 2013 unterteilt werden kann, können Sie davon ausgehen, dass der 0000Teil eine bestimmte Tageszeit angibt, in diesem Fall 00 Stunden, 00 Minuten. Oder schauen Sie einfach in der Manpage nach touch, die Ihnen genau sagt, wie das Format lautet (siehe -t).
JAB

@ Geek Die Manpages sind dein Freund :-)
JRFerguson

39

Der touchHauptzweck des Befehls besteht darin, die Zeitstempel von Dateien zu bearbeiten und Dateien zu erstellen.

Beispiele

1. Dateien erstellen

$ 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

HINWEIS: Die total 0Ausgabe von ls -list korrekt. Diese Implementierung von lszeigt die Anzahl der Blöcke an, die von den Dateien verwendet werden, wenn sie aufgelistet sind. Sie können sich davon überzeugen, indem Sie den -sSchalter zu hinzufügen ls. Dies listet die von jeder Datei verwendeten Blöcke auf. Hier habe ich 2 Zeichen zu Datei1 & Datei2 hinzugefügt.

Beispiel

$ 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. Zeit- / Datumsinfo eines Datei-Stat-Befehls

$ 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: -

Wir können touchdie verschiedenen Zeitstempel für eine bestimmte Datei bearbeiten.

3. Auszug aus der Touch-Manpage

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

4. Zugriffszeit manipulieren

$ 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. Ändern Sie die Uhrzeit

$ 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: -

Sie wundern sich vielleicht über die Änderungszeit (ctime). Das kann nicht mit manipuliert werden touch. Hier wird der Zeitpunkt aufgezeichnet, zu dem Metadaten in der Datei berührt wurden. In dieser U & L-Frage und Antwort finden Sie weitere Informationen mit dem Titel: Was können Sie mit einer Datei tun, ohne den Zeitstempel "Ändern" auszulösen? .


@sim: Meine Frage impliziert, dass ich weiß, dass Touch zum Ändern von Zeitstempeln dient. Ich wollte nur wissen, warum ein ehrlicher Benutzer das möchte. Wenn es nicht den ctime-Teil Ihrer Antwort gegeben hätte, hätte ich Ihnen eine -1 gegeben.
Quora Feans

16
@QuoraFea - meine Antwort ist zu Ihrem Vorteil und für jeden Benutzer, der in Zukunft darauf stößt. Bitte nehmen Sie nicht an, dass eine Antwort nur für Sie bestimmt ist, und es tut mir leid, wenn ich Sie in irgendeiner Weise beleidigt habe. Es war nicht meine Absicht, ich habe lediglich versucht, die Grundlagen der Funktionsweise der Zeit zu erklären.
slm

@sim: Ich bin nicht beleidigt, dachte nur, die Antwort würde nicht in die richtige Richtung gehen. Trotzdem danke für diese Antwort.
Quora Feans

@QuoraFea - Sie sind herzlich willkommen und vielen Dank für Ihre Frage. Sie werden geschätzt!
slm

1
@ Geek - versuchen Sie die Befehle. Das ist die korrekte Ausgabe ls -lin einem Verzeichnis, in dem die Dateien die Größe 0 haben und noch nichts anderes vorhanden ist. Sobald Sie eine der Dateigrößen angeben, wird die Gesamtsumme mit der Anzahl der von den Dateien verwendeten Blöcke angezeigt. Sehen Sie sich meine Updates an, wenn Sie sich nicht sicher sind. Ich habe ein Beispiel hinzugefügt.
slm

20

Abgesehen von den beiden anderen sehr guten Antworten, die Sie erhalten haben, ist eine weitere Verwendung, in Ihren Worten, zu

Erstellen Sie den falschen Eindruck über das Alter einer Datei

Zum Beispiel zur Verwendung in Backup-Schemata . Möglicherweise möchten Sie ein Backup nicht mit einem neueren aktualisieren, da diese identisch sind oder da die Änderungen im Vergleich zu den Kosten für die Aktualisierung eines Backups, beispielsweise auf einer langsamen Leitung zu einem Remote-Host, irrelevant sind. Um dies zu erreichen, haben Sie die einfache Möglichkeit, die Sicherungsdatei mit einem neueren Zeitstempel zu kennzeichnen, nicht zu fälschen, sondern zu erklären, dass der Gültigkeitszeitstempel dieser Datei jetzt ein anderer ist.

Der Eindruck über das Alter der Akte ist jetzt zwar falsch, aber seine Bedeutung ist real und legitim.


20

Eine der häufigsten Verwendungen von touchist - oder war es zumindest -, um eine Neuerstellung des Codes auszulösen.

Die üblichen Build-Tools - makeund ihre Ableitungen - versuchen, Arbeit zu sparen, indem sie Dateien nicht neu kompilieren / neu erstellen, es sei denn, eine der Dateien, mit denen sie erstellt wurden, hat sich geändert - zum Beispiel, wenn eine .o-Datei aktueller als die .c-Datei ist In der Regel kann davon ausgegangen werden, dass die C-Quelle seit der Kompilierung zur Erstellung dieser Objektdatei nicht geändert wurde.

Aber es gibt Zeiten, in denen Sie einen Wiederaufbau erzwingen möchten. Sie könnten eine unnötige Änderung an einer der Quelldateien vornehmen, dies könnte jedoch versehentlich zu Beschädigungen führen. Stattdessen könnten Sie touchdie Datei einfach so gestalten , dass sie neu aussieht, ohne dass das Risiko besteht, dass der Inhalt geändert wird - und das würde ausreichen, um zu überzeugen, makedass es an der Zeit ist, alles neu zu erstellen, was von dieser Datei abhängt.

Es gibt andere Verwendungen, aber historisch gesehen war das die große.


Obwohl es eine gute Idee ist, eine Datei zu ändern, um einen Neuaufbau zu bewirken, würde ich dagegen argumentieren. Einige Quellcode-Revisionssysteme können durch eine geänderte Datei verwirrt werden. Ist touchalso so schlimm wie ein manueller Wechsel. Um einen Neuaufbau zu veranlassen, schlage ich vor, die Ausgabedateien .oder fraglichen Quelle zu löschen .
Harper

1
Manuelle Änderungen und das Entfernen der .o-Dateien erfordern mehr Zeit und Eingabe, und eine manuelle Änderung ist wesentlich fehleranfälliger. Und wir reden nur über das Ändern des Zeitstempels in einer Arbeitskopie. Wenn Änderungen danach vorgenommen werden, wird der Änderungszeitstempel in der Datei korrekt wiedergegeben. Und nicht alle Versionskontrollsysteme werden durch einen Zeitstempel verwechselt.
David

1
Wie David sagte. Dies war vor nicht allzu langer Zeit die Standardpraxis von Unix und ist nach wie vor die Standardpraxis für Entwickler, die außerhalb von IDEs arbeiten.
Keshlam

12

Ich habe mit mindestens einem Webframework gearbeitet (kann mich nicht erinnern, welches), das im Entwicklungsmodus die Quellcodedateien auf Änderungen überprüft und die Anwendung dann neu geladen hat.

Natürlich wollte man manchmal, dass es neu geladen wird, nachdem etwas geändert wurde, das es nicht sah. In diesem Fall hat touchdie Hauptkonfigurationsdatei den Trick getan.

Im Allgemeinen also immer dann, wenn Sie einen Prozess starten möchten, der durch Änderungen an einer Datei ausgelöst wird, ohne die Datei tatsächlich zu ändern.


4
Dies ist tatsächlich bei mod_wsgi und apache der Fall; Sie können z. B. eine Django-Web-App neu laden, indem Sie einfach die wsgi-Datei berühren.
Sapi

11

Rechtmäßiger Gebrauch der Berührung:

  • Aktualisieren Sie den Zeitstempel der Bilddateien (GIF / JPG / etc) auf den Zeitpunkt, zu dem sie aufgenommen wurden. Nicht alle Renderer lesen oder beachten die EXIF-Informationen.
  • Halten Sie die c / m-Zeit ein, wenn Sie eine Reihe von Dateien massenweise aktualisieren, wobei der Zeitstempel für das Dateibündel wichtig ist.
  • Stellen Sie die Zeit einer Batch-Datei (dh CSV) ein, wenn Sie nach einem Fehler einen weiteren Import durchführen müssen und das Importprogramm vom Zeitstempel abhängt (überlassen Sie diese Diskussion einem anderen Thema :-)).
  • Archivierungszwecke: Erstellen Sie Backups in Ordnern nach Jahr, und setzen Sie die Zeit für diese Ordner für eine einfache Sortierung auf den 1. Januar JJJJ

7

Eine Verwendung besteht darin, den Zeitstempel einer Datei zu korrigieren, die nicht richtig eingestellt wurde.

Beispielsweise führt die meiste Zeit, in der Sie eine Datei kopieren (und in manchen Fällen, in denen Sie eine Datei verschieben), dazu, dass die neue Datei einen Zeitstempel der aktuellen Zeit anstelle des Zeitstempels der Originaldatei aufweist.

In der Regel ist dies nicht erwünscht. Touch kann das "reparieren".

Eine andere Verwendung besteht darin, eine Dateiänderung wiederzugeben, die rückgängig gemacht wurde, indem der Zeitstempel der Datei auf den Stand vor den Vorgängen "Bearbeiten ... Rückgängigmachen" zurückgesetzt wurde.


2
Tatsächlich. Die Zeit, die ich gefunden habe, alias cp='cp --preserve=timestamps'ist für mich im PC-Land besser geeignet…
Runium

5

Ein wichtiger Unterschied zu " thingslike" echo(oder noch besser, > filewie von anderen erwähnt) ist, dass durch Berührung der Inhalt nicht zerstört wird. > fileleert eine Datei. touchwird nicht. Anstatt über Tricks nachzudenken, um Schäden an Inhalten zu vermeiden, verwenden Sie einfach Touch! Es wird sowieso weniger Arbeit im Kernel erledigen, da es nur mit den Attributen der Datei funktioniert, ohne Zeit zu verschwenden, um sich tatsächlich auf ein Öffnen vorzubereiten und dann ein Schließen durchzuführen.

Durch Berühren kann der Zeitstempel möglicherweise geändert werden, auch wenn sich die Datei derzeit unter einer obligatorischen oder beratenden Sperre befindet oder exklusiv geöffnet ist. Hmmm, habe das noch nie getestet oder darüber nachgelesen ...


2
>>wird angehängt anstatt zu überschreiben
Michael Mrozek

Ich habe darüber nachgedacht, das zu erwähnen, aber es bewegt sich immer mehr auf dem Gebiet der Nebenwirkungen. Sie müssen auch die Tatsache erwähnen, dass es einen Fehler auslösen würde, wenn die Datei bereits exklusiv geöffnet wurde, usw. usw. usw. Ein Problem, das durch die Verwendung von> ebenfalls auftreten könnte. Ich denke, mein zweiter Punkt - abgesehen davon, dass es geringfügig schneller ist, nur die Statistiken der Datei zu berühren - ist, dass es eine gute Idee ist, Code zu schreiben, der es klar sagt, anstatt um den heißen Brei herumzuspielen.

4

Hier ist eine - ich benutze ein Softwareprogramm namens SageTV, um Fernsehsendungen aufzunehmen - diese werden oft in MPEG-2 aufgezeichnet, was kein sehr effizienter Codec ist, und es ist auch nicht iPad / iPhone-freundlich. Also konvertiere ich die Dateien in MP4-Dateien. Bei der Wiedergabe der Dateien erwartet SageTV jedoch, dass der Zeitstempel der Datei zum Zeitpunkt des Beginns der TV-Sendung liegt. Andernfalls wird die Zeitachse der Sendung verzerrt, sodass es nicht einfach ist, FF oder REW auszuführen. Aus diesem Grund setze ich mit touch den Zeitstempel der .mp4-Datei so zurück, dass er mit der Originaldatei übereinstimmt.
Ist das echt?


2

Oft haben Sie einen Prozess, der sich von der Benutzer-ID ändert, z. B. von root -> etwas anderes. Mit Touch können Sie eine Datei an einem Ort erstellen, den nur Root berühren kann, bevor sich die Anwendung als der andere Benutzer bei ihm anmeldet.


Das ist keine Berührung, die mit "Echo" nicht zu erreichen ist - siehe Originalfrage des Autors
Domingo Ignacio Galdos

Echo beinhaltet das Öffnen eines Streams und so weiter. Touch kann durch direktes Arbeiten mit Inodes hyperoptimiert werden. LEISTUNG FTW!
user56560

2

Bei der Arbeit haben wir ein Archiv von digitalen Karten, die mehr als 15 Jahre zurückreichen. Diese alten Karten werden in einer Vielzahl von Formaten wie PostScript, EMF, PRN, HPGL2, PDF usw. gespeichert, die die meisten Programme nicht verstehen. Oder Sie benötigen ein Dutzend verschiedene Programme, um sie alle zu sehen.

Um die Suche und das Durchsuchen all dieser verschiedenen Formate zu vereinfachen, erstellen wir JPEG-Versionen der Karten und verwenden dann touch, um die JPEG-Datei mit dem Zeitstempel der Originalquelldatei abzustimmen - oft Jahre nachdem das Original erstellt wurde.

Jetzt können wir mit einem einzigen Programm wie Picasa die gesamte Bibliothek anzeigen und bestimmte Datumsbereiche trivial lokalisieren. Ohne Berührung müssten wir für jedes einzelne Bild Datumsmetadaten hinzufügen, wahrscheinlich manuell, und dann nach diesen Zeichenfolgen suchen, wenn wir nach einem bestimmten Datumsbereich suchen.


1

Ich habe es noch nicht für diesen Zweck verwendet, aber ich habe ein Skript, das die Dateien und ihre Daten aus einem Verzeichnis liest und sie für die Verwendung auf einer Webseite liest. Wenn ich eine bearbeiten muss, wird das Datum geändert. Ich habe darüber nachgedacht touch, ihre Bestellung zurückzusetzen.


1

Einige Init-Skripte vergleichen den Zeitstempel einer Konfigurationsdatei mit ihrer eigenen PID-Datei. Das Ergebnis entscheidet, ob der ausgeführte Dienst neu geladen wird oder nicht.

Wenn es eine Situation gibt, in der Sie die Konfiguration nicht ändern, aber das Neuladen erzwingen möchten, hilft Ihnen touch hier.


0

Ich habe einen Cron-Job, der die Änderungen aus einer Datenbank abruft, die zwischen der letzten Ausführung des Jobs und der aktuellen Ausführung aufgetreten sind. Es wird eine XML-Datei der Änderungen erstellt, die dann in einer anderen Datenbank verarbeitet werden. Die letzte Laufzeit wird anhand des Zeitstempels in der XML-Ausgabedatei ermittelt. *

Wenn bei der Verarbeitung der XML-Datei etwas schief geht, möchte ich möglicherweise den Lauf ab dem ursprünglichen Datum wiederholen, nicht ab dem Datum, auf das sich der Zeitstempel der neuen XML-Datei bezieht.

Der einfachste Weg, dies zu tun, anstatt die aufgerufenen Skripte zu bearbeiten, besteht darin, die XML-Datei zu berühren und den Zeitstempel auf das von mir gewünschte Datum zu setzen.

Auch wenn ich neu beginne (ohne vorherige XML-Ausgabedatei), kann ich einfach deren Existenz mit touch simulieren.

[*] Bevor jemand darauf hinweist - Mir ist klar, dass der Zeitpunkt, an dem der Auftrag gestartet wird und das Schreiben der XML-Datei eine Zeitlücke von einigen Minuten lässt, in der DB-Änderungen auftreten können. Der Job wird zu einem Zeitpunkt ausgeführt, an dem Änderungen an der Datenbank äußerst unwahrscheinlich sind. Das ist meine Entschuldigung und ich bleibe dabei :-)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.