Tengo dos archivos: file1y file2. ¿Cómo agrego los contenidos de file2a file1para que los contenidos de file1persistan en el proceso?
418
Utilice la redirección integrada de bash (tldp) :
cat file2 >> file1
sudoalcatcomando (e ingresar las credenciales si se le solicita).teeprograma:cat 1 | tee -a 2 3. Puede colocar tantos archivos como desee después del interruptor--append(o-apara abreviar).cat file2 >> file1El
>>operador agrega la salida al archivo con nombre o crea el archivo con nombre si no existe.cat file1 file2 > file3Esto concatena dos o más archivos a uno. Puede tener tantos archivos fuente como necesite. Por ejemplo,
cat *.txt >> newfile.txtActualizació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, primerofile1se trunca a longitud cero y se abre para la salida, luego elcatcomando intenta concatenar el archivo ahora de longitud cero más el contenido defile2intofile1. El resultado es que el contenido original defile1se pierde y en su lugar hay una copia de lafile2cual 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 > file1el 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 > file3es el comando apropiado que @asir estaba buscando.>se ejecuta primero. Entonces, la ejecucióncat file1 file2 > file1primerofile1intentarí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
sudoel 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/nullPrueba 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
logfilees el bit importante. Puede interrumpir el procesoCtrl-Cy reanudarlo especificando exactamente el mismo comando nuevamente y ddrescue leerálogfiley reanudará desde donde lo dejó. La-o Abandera 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ñofile1en bytes (puede pegar en la salida delssi 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:
teetiene la ventaja de que puede agregar tantos archivos como desee, por ejemplo:agregará los contenidos de
file1afile2,file3yfile4.Desde la página del manual:
fuente
catpuede ser la solución fácil, pero eso se vuelve muy lento cuando capturamos archivos grandes,find -printes 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 honestamentecates más legible:>> file1 < file2El
>>anexa STDIN afile1y la<vuelcafile2a STDIN .fuente