Was ist der Unterschied zwischen Touch-Datei und> Datei?

17

Ich bin ein bisschen Neuling auf Linux, und ich frage mich , ob oder nicht >und touchhaben die gleiche Wirkung. Ich meine, haben die folgenden zwei Befehle die gleiche Wirkung ?:

$ > file.txt

$ touch file.txt

Wenn ja, wäre es toll zu wissen, dass ich einfach `> file.txt 'eingeben kann, um neue Dateien zu erstellen.

lmiguelvargasf
quelle
5
Wenn es sie file.txtschon gibt und sie nicht leer sind, tun sie es bestimmt nicht.
fkraiem
1
@fkraiem, könntest du bitte eine ausgearbeitete Antwort geben?
lmiguelvargasf
4
Er sagt, wenn Sie toucheine Datei haben, die Daten enthält, passiert nichts, aber wenn Sie >die Datei haben, werden diese gelöscht.
WinEunuuchs2Unix
Ich hab es geschafft. Vielen Dank für diese Klarstellung @ WinEunuuchs2Unix
lmiguelvargasf
Möchten Sie die Frage beantworten, mich die Frage beantworten lassen, @fkraiem sie beantworten lassen oder sie löschen?
WinEunuuchs2Unix

Antworten:

24

Beide touchund >erstellen eine neue Datei, wenn sie nicht existiert. Wie die folgenden Terminalbefehle zeigen, werden bei touchder Aktualisierung einer vorhandenen Datei die Zugriffszeiten / zuletzt geänderten Zeiten aktualisiert. Wenn Sie >jedoch eine vorhandene Datei bearbeiten, wird diese abgeschnitten und die zuletzt geänderte Zeit aktualisiert (Zugriffszeit nicht). Beachten Sie, dass >die Datei nicht gelöscht oder die Verknüpfung aufgehoben wird. Der Inode bleibt derselbe - weshalb >/ oder truncatehäufig verwendet werden, um Protokolldateien auch bei geöffnetem Datei-Handle zu löschen.

rick@dell:~$ > EmptyFile

rick@dell:~$ touch EmptyFile2

rick@dell:~$ ls Empty*
EmptyFile  EmptyFile2

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ touch EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:32 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

Wie in den Kommentaren erwähnt, touchhandelt es sich um einen externen Befehl, der nur für Dateien ausgeführt wird. >ist eine in die Shell integrierte Funktion, die vielen verschiedenen Zwecken dient. Normalerweise würden Sie sehen, wie es verwendet wird cat source.fil > target.fil.

Ein langes Formular zum Leeren einer Datei wäre:

cat /dev/null > emptyme.fil

Die Verwendung von > emptme.filbewirkt dasselbe in einem kompakten Format, bei dem nichts in die Datei umgeleitet wird.

WinEunuuchs2Unix
quelle
Anwendungsfall: > file.txteignet sich zum Löschen von Protokolldateien.
Rinzwind
8
Es ist nicht wirklich neu erstellt. Die vorhandene Datei wird abgeschnitten. Dies unterscheidet sich davon, dass die Verknüpfung der alten Datei aufgehoben und eine neue erstellt wird. Der größte beobachtbare Unterschied besteht darin, dass bei einem Prozess die alte Datei noch geöffnet oder zugeordnet ist. Das Abschneiden würde sich jedoch auf die Datei auswirken, die andere Prozesse geöffnet haben.
Peter Cordes
1
Wir sind uns nicht sicher, ob "größter beobachtbarer Wert" vorliegt - es ist einfach zu beobachten, ob Hardlinks beschädigt sind (wenn Sie ln foo barund dann löschen und neu erstellen foo, barbleibt der vorherige Inhalt erhalten).
Charles Duffy
1
Oh ja, das ist ein noch leichter zu beobachtender Unterschied. Daran hätte ich denken sollen: P
Peter Cordes
@ Charles-Duffy Klar, wenn es 2 Links zu einer Geschichte gibt, die offensichtlich sind, hat das wohl nichts mit dem zu tun, was Peter Cordes gesagt hat. Wenn Sie eine Datei löschen / die Verknüpfung aufheben, die gerade verwendet wird / geöffnetes Dateihandle hat, wird sie nicht gelöscht. rm /var/log/nginx/access.logNehmen wir zum Beispiel an, Sie hätten 0 Links, obwohl Nginx diese Datei geöffnet hatte, aber der Inode wäre noch vorhanden. lsof -c nginx | grep access.logdann mit der pid ls -l /proc/<pid>/fd/ | grep access.logund schließlich cat / proc / <pid> / fd / <dateiname vom vorigen befehl> `. Kommentieren, obwohl das alt ist. Hoffe, es hat Sinn gemacht
Skrewler
14

Es gibt einen wesentlichen Unterschied zwischen den beiden. Touchist ein Befehl, mit dem eine Datei mit einem Zeitstempel versehen wird. Das >Symbol ist ein Standard-Ausgabe-Redirector.

Verwendung der beiden erklärt

Nutzung von Touch

Wenn die Datei nicht existiert, wird sie erstellt.

Touch wird häufig zum Erstellen von Flags verwendet. Wenn Sie beispielsweise alle Dateien auf Ihrem System zweimal suchen möchten, können Sie die folgende Befehlsfolge verwenden:

$ touch -t 201609292200 starttime 
$ touch -t 201609292300 endtime

Dadurch werden die folgenden Dateien erstellt (oder der Zeitstempel geändert, falls vorhanden):

-rw-rw-r-- 1 ljames ljames 0 Sep 29 23:00 endtime
-rw-rw-r-- 1 ljames ljames 0 Sep 29 22:00 starttime

Jetzt können Sie mit find alle Dateien anzeigen oder verarbeiten, die zu dieser Stunde geändert wurden (Zeit zwischen diesen beiden Dateizeitstempeln, dh zwischen 22 und 23 Uhr vom 29. September 2016).

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n"

Dies ist eine Teilausgabe des obigen Befehls find:

-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/[email protected]_groups.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/[email protected]
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/address_book_backups/abook.mab.bak
-rw-rw-r-- 09/29 23:00 00 /home/users/l/j/ljames/endtime
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/Temp
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi/1.337.0_0

Verwendung der Ausgabeumleitung

Das Umleitungssymbol leitet die Standardausgabe in die angegebene Datei um. Abhängig von Ihren Einstellungen für Clobber / Noclobber, wenn dies fehlschlagen könnte. Noclobber erstellt die Datei nur, wenn sie nicht existiert.

Es gibt eine Reihe von Versionen der Umleitungsausgabe, darunter:

> - Standardausgabe umleiten. Erstellen oder überschreiben Sie die vorhandene Datei.
>> - Anhängen umleiten. Erstellen Sie eine vorhandene Datei oder hängen Sie sie an diese an.
> & - Leitet sowohl die Standardausgabe als auch den Standardfehler um.
>> & - Standardausgabe und Standardfehler umleiten / anhängen

Mit dem findobigen Befehl können wir den Inhalt aller Dateien, die innerhalb der angegebenen Stunde erstellt wurden, in eine Datei umleiten, die wir später protokollieren und untersuchen können:

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log
LD James
quelle
Viele Leute haben erwähnt, dass, wenn es file.txtexistiert und nicht leer ist > file.txt, der Inhalt gelöscht touch file.txtwird, aber nicht. Aber niemand hat erwähnt, dass dies >> file.txtein guter Ersatz für ist touch file.txt- es wird die Datei erstellen, wenn sie nicht existiert (vorausgesetzt, Sie haben die Berechtigung dazu), aber es wird keine vorhandene Datei abgeschnitten. Siehe Was ist der Unterschied zwischen ">" und ">>"?
G-Man sagt, dass Monica
Dies wird im Abschnitt erklärt Usage of Output redirection. Hinweis heißt >>= Redirect append>.
LD James
Ja, und das ist völlig klar - für Leute, die es bereits wissen. Versetzen Sie sich in die Lage des OP - Sie haben eine Textwand gepostet, die zu lang ist, um gelesen zu werden . er wird von Ihrer Antwort, >> file.txtdie ein praktikabler Ersatz für ist, nichts verstehen touch file.txt. (Die Tatsache , dass Sie die einzige Person sind , die erwähnten >> überhaupt ist , warum ich meinen Kommentar unter Ihrer Antwort geschrieben, anstatt unter der Frage.)
G-Man sagt ‚wieder einzusetzen Monica‘
1
@ G-Man Einige Leute verwechseln das Umleitungssymbol als Ersatz für Berührungen. Es ist jedoch kein Ersatz. Die Details meiner Antwort sind, um diesen Fehler zu klären. Die Beispiele für die Verwendung der beiden dienen der Verdeutlichung. Bitte beachten Sie, dass die erste Zeile die ersten Einzelheiten Ihres aktuellen Kommentars beantwortet. Es heißt, es gibt einen signifikanten Unterschied zwischen den beiden. Das OP interessiert sich für den Unterschied. Der andere Teil der Antwort besteht darin, auf das Interesse des OP an beiden zu reagieren. Es gibt verschiedene Effekte und es gibt Gründe für den Unterschied.
LD James
9

>ist der Shell-Ausgabeumleitungsoperator, mit dem STDOUT der vorhergehenden Befehle an den nachstehenden Dateideskriptor umgeleitet wird >. Wenn die Datei vorhanden ist, wird der Inhalt abgeschnitten, da die Datei mit dem Flag " open(2)-ed" versehen O_TRUNCist. Wenn die Datei nicht vorhanden ist, wird sie erstellt.

Wichtig zu beachten ist, dass dieser Umleitungsoperator von der Shell verarbeitet wird, bevor der vorhergehende Befehl ausgeführt wird. Dies hängt also nicht von einem Befehl ab und wird von der Shell selbst verarbeitet.

Beachten Sie, dass sich einige Shells (z. B. zsh) bei leerer Umleitung anders verhalten als:

 >file.txt

Eine typische Problemumgehung besteht darin, den Befehl :( true) no-op hinzuzufügen :

 : >file.txt

Traditionell besteht der Hauptzweck darin touch, den Zeitstempel einer Datei zu ändern und keine Datei zu erstellen.

touchErstellt eine Datei nur, wenn die im Argument genannten Dateien nicht vorhanden sind. Andernfalls wird die Änderungszeit der Datei in den aktuellen Zeitstempel geändert. Sie können auch die Zugriffszeit und die Inode-Erstellungszeit mit ändern touch.

heemayl
quelle
zshunterstützt die leere Umleitung - sie verhält sich ähnlich wie die Umleitung catohne Argumente in eine Datei. Grundsätzlich wird alles, was Sie eingeben, bis zu einem EOF-Zeichen oder einem Interrupt in die Datei geschrieben. Dies spiegelt zshdas Verhalten mit just wider <file, das einfach den Dateiinhalt druckt, wie cates tun würde. Diese können konfigurierbar sein, ich habe <filedie Datei in einem Pager geöffnet gesehen .
8bittree
@ 8bittree Was ich gemeint habe ist, dass du Eingaben EOFmachen cat >file.txtmusst (wie du gesagt hast), wo es ausreichen würde, wenn du bashnur machst >file.txt.
Heemayl
Fairerweise schlug ich eine Bearbeitung vor, die meiner Meinung nach die Idee klarer vermittelt.
8bittree
@ 8bittree Genehmigt.
Heemayl
(1) touchAktualisiert standardmäßig sowohl die Änderungszeit als auch die Zugriffszeit der Datei. Es gibt Optionen, um nur das eine oder das andere zu aktualisieren. (2) Unix / Linux / POSIX unterstützen im Allgemeinen keine Inode-Erstellungszeit. Einige Dateisystemtypen unterstützen es, aber es gibt keine universelle Möglichkeit, es zu betrachten, geschweige denn zu ändern. Können Sie eine Referenz angeben, die besagt, dass es eine Inkarnation gibt touch, mit der der Benutzer die Erstellungszeit des Inodes ändern kann?
Scott