Qual è la differenza tra touch file e file?

16

Sono una specie di novizio per Linux, e mi chiedo se > e touch abbiano o meno lo stesso effetto. Voglio dire, i seguenti due comandi hanno lo stesso effetto?:

$ > file.txt

$ touch file.txt

Se è così, sarebbe bello sapere che posso semplicemente digitare "& gt; file.txt 'per creare nuovi file.

    
posta lmiguelvargasf 30.09.2016 - 04:22
fonte

3 risposte

23

Sia touch che > creeranno un nuovo file se non esiste. Come i seguenti comandi del terminale mostrano quando touch di un file esistente viene aggiornato l'accesso / l'ultima volta modificata. Ma se si > su un file esistente viene troncato e l'ultima ora modificata viene aggiornata (il tempo di accesso non lo è). Tieni presente che > non elimina / scollega il file. L'inode rimane lo stesso, motivo per cui > / o truncate vengono comunemente usati 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 sui file. > è una funzionalità integrata della shell che serve a molti scopi diversi. Normalmente lo vedresti usato come cat source.fil > target.fil .

Un lungo modulo per svuotare un file sarebbe:

cat /dev/null > emptyme.fil

L'utilizzo di > emptme.fil realizza la stessa cosa in un formato compatto di reindirizzamento di nulla al file.

    
risposta data WinEunuuchs2Unix 30.09.2016 - 04:53
fonte
14

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

Uso dei due spiegati

Uso del tocco

Se il file non esiste creerà il file.

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

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

Ciò creerà i seguenti file (o cambierà la data e l'ora 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 utilizzare find per visualizzare o elaborare tutti i file che sono stati modificati in quell'ora (intervallo tra i due timestamp di questi 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 above find:

-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 al file specificato. A seconda delle impostazioni del clobber / noclobber, potrebbe non riuscire. Noclobber creerà il file solo se non esiste.

Esistono diverse versioni dell'output di reindirizzamento che include:

>   - Redirect standard output. Create or overwrite the existing file.
>>  - Redirect append.  Create or append to existing file.
>&  - Redirect both standard output and standard error.
>>& - Redirect/Append both standard output and standard error

Potremmo utilizzare il nostro comando find sopra per reindirizzare il contenuto di tutti i file creati nell'ora specificata a 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
    
risposta data L. D. James 30.09.2016 - 06:24
fonte
9

> è l'operatore di reindirizzamento dell'output della shell, utilizzato per reindirizzare lo STDOUT dei precedenti comandi al descrittore di file indicato dopo > . Se il file è presente, il contenuto verrà troncato, poiché il file con open(2) -ed con O_TRUNC flag e se il file non esiste, verrà creato.

Importante notare che questo operatore di reindirizzamento sarà gestito dalla shell prima dell'esecuzione del comando precedente, quindi questo non dipende da alcun comando e gestito dalla shell stessa.

Nota che alcune shell (ad esempio zsh ) si comportano diversamente con il reindirizzamento vuoto come:

 >file.txt

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

 : >file.txt

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

touch crea un file, solo quando il file (s) menzionato nell'argomento non esiste, altrimenti cambia il tempo di modifica del file in timestamp corrente. Puoi anche modificare il tempo di accesso e il tempo di creazione degli inode utilizzando touch .

    
risposta data heemayl 30.09.2016 - 12:06
fonte

Leggi altre domande sui tag