it-swarm.com.de

Was sind die legitimen Verwendungszwecke des Befehls "touch"?

Was ist der Sinn des Befehls touch? Ich weiß, dass ich damit leere Dateien erstellen kann, aber so ist es auch mit echo -n.

Warum sollte sonst jemand die Zeitstempel einer Datei ändern müssen? Wenn ich nicht den falschen Eindruck über das Alter einer Datei erwecke, sehe ich keine andere Verwendung, und diese ist (aus meiner Sicht) keine legitime.

82
Quora Feans

Ein Vorteil von touch ist, dass beliebige Zeitstempel angegeben werden können, während echo -n ergibt immer die aktuelle Zeit.

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

Andere Verwendungszwecke sind das Erstellen von Dateien, die ausschließlich aufgrund ihrer Existenz funktionieren, z. /etc/nologin, das Anmeldungen nicht zulässt, falls vorhanden. Ich würde auch argumentieren, dass touch myfile ist ein einfacheres Konstrukt als echo -n >> myfile sowie kürzer zu tippen.

97
casey

Der zugrunde liegende Systemaufruf (utime) ist wichtig, damit verschiedene Dienstprogramme wie tar die Zeitstempel einer neu kopierten (nicht geteerten) Datei festlegen können. Einige Sicherungsdienstprogramme können auch optional zum Zurücksetzen des letzten Zugriffs der von ihnen kopierten Dateien verwendet werden.

Eine legitime Verwendung von touch besteht darin, eine Datei mit einem bestimmten Zeitstempel zu erstellen. Eine solche "Referenz" -Datei kann dann von Befehlen wie find verwendet werden. Zum Beispiel, um alle Dateien zu finden, die kürzlich geändert wurden als am 1. November 2013 (dh 2013/11/01) "

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

Der Hauptzweck des Befehls touch 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: Das total 0 Ausgabe von ls -l ist richtig. Diese Implementierung von ls zeigt die Anzahl der Blöcke an, die von den Dateien verwendet werden, wenn sie aufgelistet sind. Sie können sich davon überzeugen, indem Sie das -s wechsle zu ls. Dadurch werden die von jeder Datei verwendeten Blöcke aufgelistet. 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 einer Datei - stat Befehl

$ 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 touch verwenden, um die verschiedenen Zeitstempel für eine bestimmte Datei zu 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. manipuliere modifiziere die Zeit

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

Möglicherweise wundern Sie sich über die Änderungszeit (ctime). Das kann nicht mit touch manipuliert werden. Dadurch wird die Zeit verfolgt, zu der Metadaten in der Datei berührt wurden. Weitere Informationen finden Sie in diesen U & L-Fragen und Antworten mit dem Titel: Was können Sie mit einer Datei tun, ohne den Zeitstempel "Ändern" auszulösen? .

38
slm

Eine der häufigsten Verwendungen von touch ist - oder zumindest früher - das Auslösen einer Neuerstellung von Code.

Die üblichen Build-Tools - make und seine Derivate - 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 - beispielsweise wenn es sich um eine O-Datei handelt Bei einer neueren Version als der .c-Quelle kann normalerweise davon ausgegangen werden, dass die C-Quelle seit dem Kompilieren zur Erstellung dieser Objektdatei nicht geändert wurde.

Aber es gibt Zeiten, in denen Sie den Wiederaufbau von etwas erzwingen möchten. Sie könnten eine unnötige Änderung an einer der Quelldateien vornehmen, dies kann jedoch dazu führen, dass versehentlich etwas beschädigt wird. Stattdessen könnten Sie die Datei einfach touch, sodass sie neu aussieht, ohne dass das Risiko besteht, ihren Inhalt zu ändern - und das würde ausreichen, um make davon zu überzeugen, dass es an der Zeit ist, alles neu zu erstellen, was davon abhängt diese Datei.

Es gibt andere Verwendungszwecke, aber historisch gesehen war das der große.

20
keshlam

Abgesehen von den anderen beiden 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 Sicherungsschemata. 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 das Aktualisieren 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 markieren, nicht Fälschung, sondern Erklärung, dass der Gültigkeitszeitstempel dieser Datei jetzt ein anderer ist.

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

20
LSerni

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

Natürlich wollten Sie manchmal, dass es neu geladen wird, nachdem Sie etwas geändert haben, das es nicht gesehen hat. In diesem Fall hat touching die 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.

12
millimoose

Legitime Verwendung von Berührung:

  • Aktualisieren Sie den Zeitstempel der Bilddateien (GIF/JPG/etc) auf die Zeit, zu der sie aufgenommen wurden. Nicht alle Renderer lesen oder beachten die EXIF-Informationen.
  • Behalten Sie die c/m-Zeit bei, 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 (d. H. CSV-Datei) 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, d. H. Sicherungen in Ordnern basierend auf dem Jahr, und anschließende Einstellung der Uhrzeit für diese Ordner auf den 1. Januar JJJJ für eine einfache Sortierung
11
sastorsl

Eine Verwendung besteht darin, den Zeitstempel einer falsch eingestellten Datei zu korrigieren.

Zum Beispiel führt die meiste Art und Weise, wie Sie eine Datei kopieren (und auf einige Arten, wie Sie eine Datei verschieben könnten), dazu, dass die neue Datei einen Zeitstempel der aktuellen Zeit anstelle des Zeitstempels der Originaldatei hat.

Normalerweise ist dies nicht erwünscht. Touch kann das "beheben".

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

7
Kevin Fegan

Ein wichtiger Unterschied zu things wie echo (oder dem noch besseren > file wie von anderen erwähnt) ist, dass Berührung den Inhalt nicht zerschmettert. > file leert eine Datei. touch wird nicht. Anstatt an Tricks zu denken, 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 damit zu verschwenden, sich tatsächlich auf ein Öffnen vorzubereiten und dann ein Schließen durchzuführen.

Durch Berühren kann der Zeitstempel wahrscheinlich geändert werden, selbst wenn sich die Datei derzeit unter einer obligatorischen oder beratenden Sperre oder einem exklusiven Öffnen befindet. Hmmm, habe das noch nie getestet oder darüber gelesen ...

5
user56373

Hier ist eines: Ich verwende ein Softwareprogramm namens SageTV, um Fernsehsendungen aufzuzeichnen. Diese werden häufig in MPEG-2 aufgezeichnet, was kein sehr effizienter Codec ist und auch nicht für iPad/iPhone geeignet ist. Also konvertiere ich die Dateien in MP4-Dateien. Bei der Wiedergabe der Dateien erwartet SageTV jedoch, dass der Zeitstempel der Datei zu Beginn der TV-Show liegt. Andernfalls wird die Timeline der Show verkorkst, sodass FF oder REW nicht einfach zu starten sind. Daher setze ich den Zeitstempel der MP4-Datei mit touch so ein, dass er mit der Originaldatei übereinstimmt.
Ist das legitim?

4
Wayner

Bei der Arbeit haben wir ein Archiv digitaler Karten, das mehr als 15 Jahre zurückreicht. 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 das einfache Suchen und Durchsuchen all dieser verschiedenen Formate zu erleichtern, erstellen wir JPEG-Versionen der Karten und verwenden dann Touch, um die JPEG-Datei mit dem Zeitstempel der ursprünglichen Quelldatei abzugleichen - oft Jahre nach der Erstellung des Originals.

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

2
matt wilkie

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 anderer Benutzer bei ihr anmeldet.

2
user56560

Einige Init-Skripte vergleichen den Zeitstempel einer Konfigurationsdatei mit ihrer eigenen PID-Datei. Das Ergebnis entscheidet, ob der laufende Dienst neu geladen werden soll oder nicht.

Wenn Sie die Konfiguration nicht ändern, sondern das Neuladen erzwingen möchten, hilft Ihnen touch hier.

1
Nils

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 zur Verwendung auf einer Webseite liest. Wenn ich eines bearbeiten muss, ändert es sein Datum. Ich habe überlegt, sie mit touch zurückzusetzen.

1
TecBrat

Ich habe einen Cron-Job, der die Änderungen aus einer Datenbank abruft, die zwischen dem letzten Lauf des Jobs und dem aktuellen Lauf aufgetreten sind. Es wird eine XML-Datei mit den Änderungen erstellt, die dann in einer anderen Datenbank verarbeitet werden. Die letzte Laufzeit wird aus dem Zeitstempel in der XML-Ausgabedatei abgerufen. *

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

Der einfachste Weg, dies zu tun, anstatt die aufgerufenen Skripte usw. zu bearbeiten, besteht darin, die XML-Datei zu berühren und zu erzwingen, dass der Zeitstempel das von mir gewünschte Datum ist.

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

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

0
Geeb