Respuestas:
Utilice la redirección integrada de bash (tldp) :
cat file2 >> file1
sudo
al cat
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, primero file1
se trunca a longitud cero y se abre para la salida, luego el cat
comando intenta concatenar el archivo ahora de longitud cero más el contenido de file2
into file1
. El resultado es que el contenido original de file1
se pierde y en su lugar hay una copia de la file2
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:
Antes de ejecutar un comando, su entrada y salida pueden redirigirse utilizando una notación especial interpretada por el shell.
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:
$ >out
... 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.
cat file1 file2 > file1
, esto no funcionará como probablemente estés esperando.
>>
el que va a modificar el archivo file1
. 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 ese cat file1 file2 > file3
es el comando apropiado que @asir estaba buscando.
>
se ejecuta primero. Entonces, la ejecución cat file1 file2 > file1
primero file1
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.
cat file2 | sudo tee -a file1 > /dev/null
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:
ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile
El logfile
es el bit importante. Puede interrumpir el proceso Ctrl-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
). Entonces wc --bytes file1 | awk '{ print $1 }'
solo extrae el tamaño file1
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
:
sudo apt install gddrescue
Para otras distribuciones, verifique su sistema de administración de paquetes para la versión GNU de ddrescue.
Otra solución:
cat file1 | tee -a file2
tee
tiene la ventaja de que puede agregar tantos archivos como desee, por ejemplo:
cat file1 | tee -a file2 file3 file3
agregará los contenidos de file1
a file2
, file3
y file4
.
Desde la página del manual:
-a, --append
append to the given FILEs, do not overwrite
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.
amey@xps ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt
amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt
real 0m3.084s
user 0m0.012s
sys 0m2.308s
amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1
real 0m2.516s
user 0m0.028s
sys 0m2.204s
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 honestamente cat
es más legible:
>> file1 < file2
El >>
anexa STDIN a file1
y la <
vuelca file2
a STDIN .