Qual è la differenza tra file touch e> file?


17

Sono sorta di novizio di Linux, e mi chiedo se >e touchhanno lo stesso effetto. Voglio dire, i seguenti due comandi hanno lo stesso effetto ?:

$ > file.txt

$ touch file.txt

In tal caso, sarebbe bello sapere che posso semplicemente digitare `> file.txt 'per creare nuovi file.


5
Se file.txtesiste già e non è vuoto, certamente no.
fkraiem,

1
@fkraiem, potresti per favore dare una risposta elaborata?
lmiguelvargasf,

4
Sta dicendo che se touchun file che contiene dati non accadrà nulla, ma se >il file verrà cancellato.
WinEunuuchs2Unix

Capito. Grazie mille per quel chiarimento @ WinEunuuchs2Unix
lmiguelvargasf

Vuoi rispondere alla domanda, farmi rispondere alla domanda, fare in modo che @fkraiem risponda o eliminarla?
WinEunuuchs2Unix

Risposte:


24

Entrambi touche >creeranno un nuovo file se non esiste. Come mostrano i seguenti comandi del terminale quando si è touchun file esistente, l'accesso / l'ora dell'ultima modifica vengono aggiornati. Ma se si >passa a un file esistente, viene troncato e l'ora dell'ultima modifica viene aggiornata (l'ora di accesso non lo è). Si noti che >non elimina / scollega il file. L'inode rimane lo stesso, motivo per cui >/ o truncatevengono comunemente utilizzati per cancellare i file di registro anche con un handle di file aperto.

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

Come menzionato nei commenti, touchè un comando esterno e funziona solo su file. >è una funzionalità integrata della shell che ha molti scopi diversi. In genere lo vedresti usato come cat source.fil > target.fil.

Un modulo lungo per svuotare un file sarebbe:

cat /dev/null > emptyme.fil

L'utilizzo > emptme.filesegue la stessa cosa in un formato compatto che non reindirizza nulla al file.


Caso d'uso: > file.txtè utile per cancellare i file di registro.
Rinzwind,

8
In realtà non è stato ricreato. Il file esistente viene troncato, il che è diverso dal scollegare il vecchio file e crearne uno nuovo. La più grande differenza osservabile è che se un processo ha ancora il vecchio file aperto o mappato, esisterebbe comunque. Ma il troncamento influirebbe sul file aperto da altri processi.
Peter Cordes,

1
Non sono sicuro del "più grande osservabile" - è facile osservare se i collegamenti fisici sono interrotti (se tu ln foo bar, e quindi elimini e ricrea foo, hai barancora i suoi contenuti precedenti).
Charles Duffy,

1
Oh sì, questa è una differenza ancora più facilmente osservabile. Avrei dovuto pensarci: P
Peter Cordes,

@ Charles-Duffy Certo, quando ci sono 2 collegamenti a un amico che sarebbe ovvio, immagino, non ha nulla a che fare con quello che stava dicendo Peter Cordes. Quando elimini / scolleghi un file che è attualmente in uso / ha un filehandle aperto, non viene eliminato. per esempio, diciamo che rm /var/log/nginx/access.logmentre nginx aveva quel file aperto avrebbe 0 collegamenti ma l'inode esisterebbe comunque. lsof -c nginx | grep access.logquindi con il pid ls -l /proc/<pid>/fd/ | grep access.loge infine cat / proc / <pid> / fd / <nome file dal comando precedente> `. Commentare anche se questo è vecchio. Spero che abbia senso
skrewler

14

C'è una differenza sostanziale tra i due. Touchè un comando usato per timestamp di un file. Il >simbolo è un redirector di output standard.

Spiegazione dell'uso dei due

Utilizzo del tocco

Se il file non esiste, verrà creato il file.

Il tocco è comunemente usato per creare bandiere. Ad esempio, se vuoi trovare tutti i file tra due volte sul tuo sistema, puoi usare questa sequenza di comandi:

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

Questo creerà i seguenti file (o cambierà il timestamp se esistono):

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

Ora puoi usare find per visualizzare o elaborare tutti i file che sono stati modificati in quell'ora (ora tra questi due timestamp dei file, ovvero tra le 22:00 e le 23:00 del 29 settembre 2016).

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

Questo è un output parziale del comando find sopra:

-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/apollothethird@gmail.com_groups.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/apollothethird@gmail.com.xml
-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

Utilizzo del reindirizzamento dell'output

Il simbolo di reindirizzamento reindirizzerà l'output standard sul file specificato. A seconda delle impostazioni del clobber / noclobber, se non riesce. Noclobber creerà il file solo se non esiste.

Esistono diverse versioni dell'output di reindirizzamento che include:

> - Reindirizza l'output standard. Crea o sovrascrivi il file esistente.
>> - Appendice di reindirizzamento. Crea o aggiungi a un file esistente.
> & - Reindirizza sia l'output standard sia l'errore standard.
>> & - Reindirizza / accoda sia l'output standard sia l'errore standard

Potremmo usare il nostro findcomando sopra per reindirizzare il contenuto di tutti i file creati nell'ora specificata su un file che potremmo registrare e studiare in seguito:

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

Molte persone hanno detto che, se file.txtesiste e non è vuoto, > file.txtne cancellerà il contenuto ma touch file.txtnon lo farà. Ma nessuno ha detto che >> file.txtè un buon sostituto touch file.txt: creerà il file se non esiste (supponendo che tu abbia il permesso di farlo), ma non troncerà un file esistente. Vedi Qual è la differenza tra “>” e “>>”?
G-Man dice 'Reinstate Monica',

Questo è spiegato nella sezione Usage of Output redirection. L'avviso è dice >>= Redirect append>.
LD James

Sì, e questo è perfettamente chiaro - per le persone che già lo sanno. Mettiti nei panni dell'OP - hai pubblicato un muro di testo che è troppo lungo troppo letto ; non capirà dalla tua risposta che >> file.txtè un sostituto praticabile touch file.txt. (Il fatto che tu sia l'unica persona che ha menzionato >> affatto è il motivo per cui ho pubblicato il mio commento sotto la tua risposta, piuttosto che sotto la domanda.)
G-Man dice 'Reinstate Monica'

1
@ G-Man Alcune persone confondono il simbolo di reindirizzamento per sostituire il tocco. Tuttavia non è un sostituto. I dettagli della mia risposta sono per chiarire questo errore. Gli esempi di utilizzo dei due sono per chiarire. Si noti che la prima riga della coppia risponde alle specifiche iniziali del commento corrente. Dice che c'è una differenza significativa tra i due. L'OP è interessato alla differenza. Quindi le altre parti della risposta sono di rispondere all'interesse del PO nei due. Ci sono effetti diversi e c'è una ragione per la differenza.
LD James

9

>è l'operatore di reindirizzamento dell'output della shell, utilizzato per reindirizzare STDOUT dei comandi precedenti al descrittore di file menzionato in seguito >. Se il file è presente, il suo contenuto verrà troncato, come file con open(2)-ed con O_TRUNCflag, e se il file non esiste, verrà creato.

È importante notare che questo operatore di reindirizzamento verrà gestito dalla shell prima dell'esecuzione del comando precedente, quindi questo non dipende da nessun comando e gestito dalla stessa shell.

Nota che alcune shell (ad es. zsh) Si comporteranno diversamente con reindirizzamento vuoto come:

 >file.txt

Una soluzione alternativa è aggiungere il comando :( true) no-op:

 : >file.txt

Tradizionalmente, lo scopo principale di touchè cambiare il timestamp di un file, non creando un file.

touchcrea un file, solo quando i file menzionati nell'argomento non esistono, altrimenti cambia il tempo di modifica del file al timestamp corrente. Puoi anche cambiare il tempo di accesso e inode il tempo di creazione usando touch.


zshsupporta il reindirizzamento vuoto - agisce in modo simile al reindirizzamento catsenza argomenti su un file. Fondamentalmente qualunque cosa tu digiti verrà scritta nel file fino a quando un carattere EOF o un interrupt. Questo rispecchia zshil comportamento di just <file, che stampa semplicemente il contenuto del file, come catfarebbe. Questi possono essere configurabili, ho visto <fileaprire il file in un cercapersone.
8

@ 8bittree Quello che volevo dire è che devi inserire EOF(come fare cat >file.txtcome hai già detto), dove bashfare semplicemente >file.txtsarebbe sufficiente.
heemayl,

Abbastanza giusto, ho suggerito una modifica che penso dia l'idea più chiaramente.
8

@ 8bittree Approved.
heemayl,

(1) Per impostazione predefinita, touchaggiorna sia il tempo di modifica sia il tempo di accesso del file. Ci sono opzioni per aggiornare solo l'una o l'altra. (2) Unix / Linux / POSIX non supportano il "tempo di creazione dell'inode", in generale. Alcuni tipi di file system lo supportano, ma non esiste un modo universale per guardarlo, e tanto meno modificarlo. Potete fornire un riferimento che dice che esiste un'incarnazione touchche consente all'utente di modificare il tempo di creazione dell'inode?
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.