¿Cuál es la diferencia entre touch file y> file?

17

Estoy un poco novato en Linux, y me pregunto si o no >y touchtener el mismo efecto. Quiero decir, ¿los siguientes dos comandos tienen el mismo efecto ?:

$ > file.txt

$ touch file.txt

Si es así, sería genial saber que puedo escribir `> file.txt 'para crear nuevos archivos.

lmiguelvargasf
fuente
55
Si file.txtya existe y no está vacío, ciertamente no.
fkraiem
1
@fkraiem, ¿podría hacer una respuesta elaborada?
lmiguelvargasf
44
Él dice que si touchun archivo que contiene datos no sucederá nada, pero si usted >el archivo se borrará.
WinEunuuchs2Unix
Lo tengo. Muchas gracias por esa aclaración @ WinEunuuchs2Unix
lmiguelvargasf
¿Desea responder la pregunta, que responda la pregunta, que @fkraiem la responda o que la elimine?
WinEunuuchs2Unix

Respuestas:

24

Ambos touchy >crearán un nuevo archivo si no existe. Como muestran los siguientes comandos de terminal cuando se encuentra touchun archivo existente, se actualiza el tiempo de acceso / última modificación. Pero si usted >a un archivo existente se trunca y la última hora modificada se actualiza (el tiempo de acceso no lo es). Tenga en cuenta que >no elimina / desvincula el archivo. El inodo permanece igual, razón por la cual >/ o truncatese usan comúnmente para borrar archivos de registro incluso con un identificador de archivo abierto.

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

Como se menciona en los comentarios, touches un comando externo y solo funciona en archivos. >es una función incorporada de shell que sirve para muchos propósitos diferentes. Por lo general, verías que se usa como cat source.fil > target.fil.

Una forma larga para vaciar un archivo sería:

cat /dev/null > emptyme.fil

El uso > emptme.fillogra lo mismo en un formato compacto de redirigir nada al archivo.

WinEunuuchs2Unix
fuente
Caso de uso: > file.txtes bueno para borrar archivos de registro.
Rinzwind
8
En realidad no se vuelve a crear. El archivo existente se trunca, lo que es diferente de desvincular el archivo antiguo y crear uno nuevo. La mayor diferencia observable es que si un proceso todavía tiene el archivo antiguo abierto o mapeado, todavía existiría. Pero truncar afectaría el archivo que otros procesos han abierto.
Peter Cordes
1
No estoy seguro sobre el "mayor observable": es fácil observar si los enlaces duros están rotos (si usted ln foo bar, y luego eliminar y volver a crear foo, bartodavía tiene su contenido anterior).
Charles Duffy
1
Oh sí, esa es una diferencia aún más fácil de observar. Debería haber pensado en eso: P
Peter Cordes
@ Charles-Duffy Claro, cuando hay 2 enlaces a un fie que sería obvio, supongo, eso no tiene nada que ver con lo que Peter Cordes estaba diciendo. Cuando elimina / desvincula un archivo que está actualmente en uso / tiene un identificador de archivo abierto, no se elimina. por ejemplo, digamos que rm /var/log/nginx/access.logmientras nginx tenía ese archivo abierto, tendría 0 enlaces pero el inodo aún existiría. lsof -c nginx | grep access.logluego con el pid, ls -l /proc/<pid>/fd/ | grep access.logy finalmente cat / proc / <pid> / fd / <nombre de archivo del comando anterior> `. Comentando a pesar de que esto es viejo. Espero que
tenga
14

Hay una diferencia sustancial entre los dos. Touches un comando que se utiliza para marcar el tiempo de un archivo. El >símbolo es un redirector de salida estándar.

Uso de los dos explicados

Uso del tacto

Si el archivo no existe, creará el archivo.

El tacto se usa comúnmente para crear banderas. Por ejemplo, si desea encontrar todos los archivos entre dos veces en su sistema, puede usar esta secuencia de comandos:

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

Esto creará los siguientes archivos (o cambiará la marca de tiempo si existen):

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

Ahora puede usar find para mostrar o procesar todos los archivos que se modificaron en esa hora (tiempo entre las dos marcas de tiempo de los archivos, es decir, entre las 10 p.m. y las 11 p.m. del 29 de septiembre de 2016).

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

Esta es una salida parcial del comando find anterior:

-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

Uso de redirección de salida

El símbolo de redireccionamiento redirigirá la salida estándar al archivo especificado. Dependiendo de su configuración de clobber / noclobber si podría fallar. Noclobber solo creará el archivo si no existe.

Hay varias versiones de la salida de redirección que incluye:

> - Redirigir salida estándar. Crea o sobrescribe el archivo existente.
>> - Redirigir anexar. Crear o agregar a un archivo existente.
> & - Redirige tanto la salida estándar como el error estándar.
>> & - Redirigir / Anexar salida estándar y error estándar

Podríamos usar nuestro findcomando anterior para redirigir el contenido de todos los archivos creados dentro de la hora especificada a un archivo que podamos registrar y estudiar más tarde:

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log
LD James
fuente
Muchas personas han mencionado que, si file.txtexiste y no está vacío, > file.txtborrará su contenido pero touch file.txtno lo hará. Pero nadie ha mencionado que >> file.txtsea ​​un buen sustituto touch file.txt: creará el archivo si no existe (suponiendo que tenga permiso para hacerlo), pero no truncará un archivo existente. Consulte ¿Cuál es la diferencia entre ">" y ">>"?
G-Man dice 'reinstalar a Monica' el
Esto se explica en la sección Usage of Output redirection. Aviso es dice >>= Redirect append>.
LD James
Sí, y eso está perfectamente claro: para las personas que ya lo saben. Ponte en la piel del OP: has publicado un muro de texto que es demasiado largo, demasiado leído ; no va a entender por su respuesta que >> file.txtes un sustituto viable para touch file.txt. (El hecho de que usted es la única persona que se menciona >> en absoluto es por eso que he publicado mi comentario debajo de su respuesta, en lugar de debajo de la pregunta.)
G-hombre dice 'Restablecer Mónica'
1
@ G-Man Algunas personas confunden el símbolo de redireccionamiento como un sustituto del tacto. Sin embargo, no es un sustituto. Los detalles de mi respuesta son para aclarar este error. Los ejemplos de uso de los dos son para ayudar a aclararlo. Tenga en cuenta que la primera línea de pareja responde a los detalles iniciales de su comentario actual. Dice que hay una diferencia significativa entre los dos. El OP está interesado en la diferencia. Entonces, las otras partes de la respuesta es responder al interés del OP en los dos. Hay diferentes efectos y hay una razón para la diferencia.
LD James
9

>es el operador de redirección de salida de shell, utilizado para redirigir STDOUT de los comandos anteriores al descriptor de archivo mencionado a continuación >. Si el archivo está presente, su contenido se truncará, como un archivo con be open(2)-ed with O_TRUNCflag, y si el archivo no existe, se creará.

Es importante tener en cuenta que este operador de redirección será manejado por el shell antes de que se ejecute el comando anterior, por lo que esto no depende de ningún comando y el mismo shell lo manejará.

Tenga en cuenta que algunos shells (p zsh. Ej. ) Se comportarán de manera diferente con una redirección vacía como:

 >file.txt

Una solución alternativa típica es agregar el comando :( true) no-op:

 : >file.txt

Tradicionalmente, el objetivo principal touches cambiar la marca de tiempo de un archivo, no crear un archivo.

touchcrea un archivo, solo cuando los archivos mencionados en el argumento no existen, de lo contrario cambia la hora de modificación del archivo a la marca de tiempo actual. También puede cambiar el tiempo de acceso y el tiempo de creación de inodo usando touch.

heemayl
fuente
zshadmite la redirección vacía: actúa de manera bastante similar a la redirección catsin argumentos a un archivo. Básicamente, lo que escriba se escribirá en el archivo hasta un carácter EOF o una interrupción. Esto refleja zshel comportamiento de just <file, que simplemente imprime el contenido del archivo, como catlo haría. Estos pueden ser configurables, he visto <fileabrir el archivo en un localizador.
8bittree
@ 8bittree Lo que quise decir es que necesita ingresar EOF(como hacer cat >file.txtlo que ha dicho), donde bastaría con bashhacerlo >file.txt.
heemayl
Justo, sugerí una edición que creo que hace que la idea se transmita con mayor claridad.
8bittree
@ 8bittree aprobado.
heemayl
(1) Por defecto, touchactualiza el tiempo de modificación y el tiempo de acceso del archivo. Hay opciones para actualizar solo uno u otro. (2) Unix / Linux / POSIX no admite el "tiempo de creación de inodo", en general. Algunos tipos de sistemas de archivos lo admiten, pero no hay una forma universal de verlo, y mucho menos modificarlo. ¿Puede proporcionar una referencia que diga que hay una encarnación touchque permite al usuario cambiar el tiempo de creación de inodo?
Scott