Tengo dos archivos: file1
y file2
. ¿Cómo agrego los contenidos de file2
a file1
para que los contenidos de file1
persistan en el proceso?
418
Utilice la redirección integrada de bash (tldp) :
cat file2 >> file1
sudo
alcat
comando (e ingresar las credenciales si se le solicita).tee
programa:cat 1 | tee -a 2 3
. Puede colocar tantos archivos como desee después del interruptor--append
(o-a
para abreviar).cat file2 >> file1
El
>>
operador agrega la salida al archivo con nombre o crea el archivo con nombre si no existe.cat file1 file2 > file3
Esto concatena dos o más archivos a uno. Puede tener tantos archivos fuente como necesite. Por ejemplo,
cat *.txt >> newfile.txt
Actualización 20130902
En los comentarios, eumiro sugiere "no intentes
cat file1 file2 > file1
". La razón por la que esto podría no dar como resultado el resultado esperado es que el archivo que recibe la redirección se prepara antes de que>
se ejecute el comando a la izquierda del . En este caso, primerofile1
se trunca a longitud cero y se abre para la salida, luego elcat
comando intenta concatenar el archivo ahora de longitud cero más el contenido defile2
intofile1
. El resultado es que el contenido original defile1
se pierde y en su lugar hay una copia de lafile2
cual probablemente no es lo que se esperaba.Actualización 20160919
En los comentarios, tpartee sugiere vincular a fuentes / información de respaldo. Para una referencia autorizada, dirijo al amable lector a la página de manual en linuxcommand.org que dice:
Si bien eso le dice al lector lo que necesita saber, es fácil pasarlo por alto si no lo está buscando y analizando la declaración palabra por palabra. La palabra más importante aquí es 'antes'. La redirección se completa (o falla) antes de ejecutar el comando.
En el caso de ejemplo de
cat file1 file2 > file1
el shell realiza la redirección primero para que los identificadores de E / S estén en su lugar en el entorno en el que se ejecutará el comando antes de ejecutarse.En el sitio web de Ian Allen, en forma de software para cursos de Linux, se puede encontrar una versión más amigable en la que se cubre la precedencia de la redirección. Su página de Notas de redirección de E / S tiene mucho que decir sobre el tema, incluida la observación de que la redirección funciona incluso sin un comando. Pasando esto al shell:
... crea un archivo vacío con nombre. El shell primero configura la redirección de E / S, luego busca un comando, no encuentra ninguno y completa la operación.
fuente
cat file1 file2 > file1
, esto no funcionará como probablemente estés esperando.>>
el que va a modificar el archivofile1
. T.Rob hizo un trabajo muy superior al explicar su respuesta en lugar de simplemente correr para presentar algo que, de hecho, era incorrecto. Basado en el texto de la pregunta, creo que esecat file1 file2 > file3
es el comando apropiado que @asir estaba buscando.>
se ejecuta primero. Entonces, la ejecucióncat file1 file2 > file1
primerofile1
intentaría luego copiar el archivo de longitud cero en sí mismo. Esto tiene sentido cuando piensa en el orden en que las operaciones podrían y deberían ocurrir, pero es lo suficientemente sutil como para sorprender a muchas personas. Entonces, si nada más, eumiro y usted han impulsado una mejora adicional a la respuesta. ¡Gracias por eso!>>
agrega al archivo y lo>
reemplaza .Nota : si necesita usar sudo , haga esto:
sudo bash -c 'cat file2 >> file1'
El método habitual de simplemente anteponer
sudo
el comando fallará, ya que la escalada de privilegios no se transfiere a la redirección de salida.fuente
cat file2 | sudo tee -a file1 > /dev/null
Prueba este comando:
fuente
Solo como referencia, el uso de ddrescue proporciona una forma interrumpible de lograr la tarea si, por ejemplo, tiene archivos grandes y la necesidad de pausar y luego continuar en algún momento posterior:
El
logfile
es el bit importante. Puede interrumpir el procesoCtrl-C
y reanudarlo especificando exactamente el mismo comando nuevamente y ddrescue leerálogfile
y reanudará desde donde lo dejó. La-o A
bandera le dice a ddrescue que comience desde el byte A en el archivo de salida (file1
). Entonceswc --bytes file1 | awk '{ print $1 }'
solo extrae el tamañofile1
en bytes (puede pegar en la salida dels
si lo desea).Como señalaron los ngks en los comentarios, la desventaja es que ddrescue probablemente no se instalará de manera predeterminada, por lo que deberá instalarlo manualmente. La otra complicación es que hay dos versiones de ddrescue que pueden estar en sus repositorios: consulte esta pregunta de askubuntu para obtener más información. La versión que desea es el ddrescue de GNU, y en los sistemas basados en Debian es el paquete llamado
gddrescue
:Para otras distribuciones, verifique su sistema de administración de paquetes para la versión GNU de ddrescue.
fuente
Otra solución:
tee
tiene la ventaja de que puede agregar tantos archivos como desee, por ejemplo:agregará los contenidos de
file1
afile2
,file3
yfile4
.Desde la página del manual:
fuente
cat
puede ser la solución fácil, pero eso se vuelve muy lento cuando capturamos archivos grandes,find -print
es rescatarlo, aunque debe usar cat una vez.fuente
time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)
y debería producir resultados similares al comando de solo gato.También puede hacerlo sin
cat
, aunque honestamentecat
es más legible:>> file1 < file2
El
>>
anexa STDIN afile1
y la<
vuelcafile2
a STDIN .fuente