Quelle est la différence entre le fichier tactile et le fichier>?

17

Je suis un peu novice de Linux, et je me demande si oui ou non >et touchj'ai le même effet. Je veux dire, les deux commandes suivantes ont-elles le même effet?:

$ > file.txt

$ touch file.txt

Si c'est le cas, ce serait formidable de savoir que je peux simplement taper `> fichier.txt 'pour créer de nouveaux fichiers.

lmiguelvargasf
la source
5
S'ils file.txtexistent déjà et ne sont pas vides, ils ne le sont certainement pas.
fkraiem
1
@fkraiem, pourriez-vous s'il vous plaît faire une réponse élaborée?
lmiguelvargasf
4
Il dit que si vous touchun fichier qui contient des données, rien ne se passera mais si vous >le fichier, il sera effacé.
WinEunuuchs2Unix
J? ai compris. Merci beaucoup pour cette clarification @ WinEunuuchs2Unix
lmiguelvargasf
Souhaitez-vous répondre à la question, me faire répondre à la question, demander à @fkraiem d'y répondre ou la supprimer?
WinEunuuchs2Unix

Réponses:

24

Les deux touchet >créera un nouveau fichier si elle n'existe pas. Comme les commandes de terminal suivantes le montrent lorsque vous touchun fichier existant, l'heure d'accès / dernière modification est mise à jour. Mais si vous accédez >à un fichier existant, il est tronqué et la dernière heure modifiée est mise à jour (l'heure d'accès ne l'est pas). Notez que >cela ne supprime / dissocie pas le fichier. L'inode reste le même - c'est pourquoi >/ ou truncatesont couramment utilisés pour effacer les fichiers journaux même avec un descripteur de fichier ouvert.

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

Comme mentionné dans les commentaires, touchest une commande externe et ne fonctionne que sur les fichiers. >est une fonction intégrée du shell qui sert à de nombreuses fins différentes. Typiquement, vous le verriez utilisé comme cat source.fil > target.fil.

Un long formulaire pour vider un fichier serait:

cat /dev/null > emptyme.fil

L'utilisation > emptme.filaccomplit la même chose dans un format compact de ne rien rediriger vers le fichier.

WinEunuuchs2Unix
la source
Cas d'utilisation: > file.txtconvient pour effacer les fichiers journaux.
Rinzwind
8
Ce n'est pas réellement recréé. Le fichier existant est tronqué, ce qui est différent de dissocier l'ancien fichier et d'en créer un nouveau. La plus grande différence observable est que si un processus a toujours l'ancien fichier ouvert ou mappé, il existerait toujours. Mais la troncature affecterait le fichier ouvert par d'autres processus.
Peter Cordes
1
Vous n'êtes pas sûr du "plus grand observable" - il est facile d'observer si les liens physiques sont cassés (si vous ln foo bar, puis supprimez et recréez foo, a bartoujours son contenu antérieur).
Charles Duffy
1
Oh oui, c'est une différence encore plus facilement observable. J'aurais dû y penser: P
Peter Cordes
@ Charles-Duffy Bien sûr, quand il y a 2 liens vers un fie qui seraient évidents, je suppose, cela n'a rien à voir avec ce que Peter Cordes disait cependant. Lorsque vous supprimez / dissociez un fichier qui est actuellement en cours d'utilisation / a un descripteur de fichier ouvert, il n'est pas supprimé. par exemple, disons que rm /var/log/nginx/access.logpendant que nginx avait ce fichier ouvert, il aurait 0 liens mais l'inode existerait toujours. lsof -c nginx | grep access.logpuis avec le pid, ls -l /proc/<pid>/fd/ | grep access.loget enfin cat / proc / <pid> / fd / <nom de fichier de la commande précédente> `. Commentant même si c'est vieux. J'espère que cela a du sens
skrewler
14

Il y a une différence substantielle entre les deux. Touchest une commande utilisée pour horodater un fichier. Le >symbole est un redirecteur de sortie standard.

Explication de l'utilisation des deux

Utilisation de Touch

Si le fichier n'existe pas, il créera le fichier.

Le toucher est couramment utilisé pour créer des drapeaux. Par exemple, si vous souhaitez rechercher tous les fichiers entre deux fois sur votre système, vous pouvez utiliser cette séquence de commandes:

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

Cela va créer les fichiers suivants (ou changer l'horodatage s'ils existent):

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

Vous pouvez maintenant utiliser find pour afficher ou traiter tous les fichiers qui ont été modifiés à cette heure (temps entre ces deux fichiers d'horodatage, c'est-à-dire entre 22 h 00 et 23 h 00 le 29 septembre 2016).

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

Il s'agit d'une sortie partielle de la commande find ci-dessus:

-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

Utilisation de la redirection de sortie

Le symbole de redirection redirigera la sortie standard vers le fichier spécifié. Selon vos paramètres de clobber / noclobber, si cela peut échouer. Noclobber ne créera le fichier que s'il n'existe pas.

Il existe un certain nombre de versions de la sortie de redirection qui incluent:

> - Redirige la sortie standard. Créez ou écrasez le fichier existant.
>> - Redirection ajouter. Créez ou ajoutez au fichier existant.
> & - Redirige la sortie standard et l'erreur standard.
>> & - Rediriger / ajouter à la fois la sortie standard et l'erreur standard

Nous pourrions utiliser notre findcommande ci-dessus pour rediriger le contenu de tous les fichiers créés dans l'heure spécifiée vers un fichier que nous pourrions enregistrer et étudier plus tard:

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log
LD James
la source
Beaucoup de gens ont mentionné que, s'il file.txtexiste et n'est pas vide, il > file.txteffacera son contenu mais touch file.txtne le fera pas. Mais personne n'a mentionné que >> file.txtc'est un bon substitut touch file.txt- il créera le fichier s'il n'existe pas (en supposant que vous en avez l'autorisation), mais il ne tronquera pas un fichier existant. Voir Quelle est la différence entre «>» et «>>»?
G-Man dit `` Réintègre Monica ''
Ceci est expliqué dans la section Usage of Output redirection. L'avis est dit >>= Redirect append>.
LD James
Oui, et c'est parfaitement clair - pour les gens qui le savent déjà. Mettez-vous à la place de l'OP - vous avez affiché un mur de texte trop long trop lu ; il ne va pas comprendre de votre réponse que >> file.txtc'est un substitut viable touch file.txt. (Le fait que vous êtes la seule personne qui a mentionné >> tout est pourquoi j'ai posté mon commentaire sous votre réponse, plutôt que dans la question.)
G-Man dit « Réintégrer Monica »
1
@ G-Man Certaines personnes confondent le symbole de redirection pour remplacer le toucher. Mais ce n'est pas un substitut. Les détails de ma réponse visent à clarifier cette erreur. Les exemples d'utilisation des deux visent à clarifier le tout. Veuillez noter que la première ligne du couple répond aux spécificités initiales de votre commentaire actuel. Il dit qu'il y a une différence significative entre les deux. Le PO s'intéresse à la différence. Donc, les autres parties de la réponse consistent à répondre à l'intérêt du PO pour les deux. Il y a différents effets et il y a des raisons à la différence.
LD James
9

>est l'opérateur de redirection de sortie du shell, utilisé pour rediriger STDOUT des commandes précédentes vers le descripteur de fichier mentionné ci-après >. Si le fichier est présent, son contenu sera tronqué, comme fichier avec open(2)-ed avec O_TRUNCindicateur, et si le fichier n'existe pas, il sera créé.

Chose importante à noter, cet opérateur de redirection sera géré par shell avant l'exécution de la commande précédente, donc cela ne dépend d'aucune commande, et géré par shell lui-même.

Notez que certains shells (par exemple zsh) se comporteront différemment avec une redirection vide comme:

 >file.txt

Une solution de contournement typique consiste à ajouter la commande no-op :( true):

 : >file.txt

Traditionnellement, l'objectif principal de touchest de modifier l'horodatage d'un fichier, et non de créer un fichier.

touchcrée un fichier, uniquement lorsque le ou les fichiers mentionnés dans l'argument n'existent pas, sinon il change l'heure de modification du fichier en horodatage actuel. Vous pouvez également modifier le temps d'accès et le temps de création d'inode à l'aide de touch.

heemayl
la source
zshprend en charge la redirection vide - il agit de manière assez similaire à la redirection catsans arguments vers un fichier. Fondamentalement, tout ce que vous tapez sera écrit dans le fichier jusqu'à ce qu'un caractère EOF ou une interruption. Cela reflète zshle comportement de just <file, qui imprime simplement le contenu du fichier, comme le catferait. Ceux-ci peuvent être configurables, j'ai vu <fileouvrir le fichier dans un pager.
8bittree
@ 8bittree Ce que je voulais dire, c'est que vous devez entrer EOF(comme faire cat >file.txtcomme vous l'avez dit), où en bashfaisant simplement >file.txtsuffirait.
heemayl
Assez juste, j'ai suggéré un montage qui, je pense, fait passer l'idée plus clairement.
8bittree
@ 8bittree approuvé.
heemayl
(1) Par défaut, touchmet à jour à la fois l'heure de modification et l'heure d'accès au fichier. Il existe des options pour mettre à jour uniquement l'un ou l'autre. (2) Unix / Linux / POSIX ne prennent pas en charge le «temps de création d'inode», en général. Certains types de systèmes de fichiers le prennent en charge, mais il n'existe aucun moyen universel de le voir, et encore moins de le modifier. Pouvez-vous fournir une référence indiquant qu'il existe une incarnation touchqui permet à l'utilisateur de modifier le temps de création de l'inode?
Scott