script - ¿Cómo agregar un archivo a otro en Ubuntu Linux?
shell script linux español (9)
Otra solución:
cat file1 | tee -a file2
tee
tiene el beneficio que puede agregar a tantos archivos como desee, por ejemplo:
cat file1 | tee -a file2 file3 file3
adjuntará el contenido de file1
a file2
, file4
y file4
.
De la página del manual:
-a, --append
append to the given FILEs, do not overwrite
Tengo dos archivos: file1
y file2
. ¿Cómo agrego el contenido de file2
a file1
para que el contenido de file1
persista en el proceso?
Pruebe este comando:
cat file2 >> file1
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 continuar en algún punto posterior:
ddrescue -o $(wc --bytes file1 | awk ''{ print $1 }'') file2 file1 logfile
El logfile
es el bit importante. Puede interrumpir el proceso con Ctrl-C
y reanudarlo especificando el mismo comando de nuevo y ddrescue leerá el logfile
y continuará desde donde lo dejó. El indicador -o A
le dice a ddrescue que comience desde el byte A en el archivo de salida ( file1
). Así que wc --bytes file1 | awk ''{ print $1 }''
wc --bytes file1 | awk ''{ print $1 }''
solo extrae el tamaño del file1
en bytes (puede pegar la salida de ls
si lo desea).
Como lo señaló ngks en los comentarios, el inconveniente es que ddrescue probablemente no se instalará por defecto, por lo que tendrá que instalarlo manualmente. La otra complicación es que hay dos versiones de ddrescue que pueden estar en tus repositorios: consulta 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 está el paquete llamado gddrescue
:
sudo apt install gddrescue
Para otras distribuciones, revise su sistema de administración de paquetes para la versión GNU de ddrescue
También puedes hacer esto sin el cat
, aunque honestamente el cat
es más legible:
>> file1 < file2
El >>
agrega STDIN a file1
y <
dump file2
a STDIN .
Utilice la redirección integrada de bash (tldp) :
cat file2 >> file1
el comando que buscas es
cat file2 >> file1
cat file2 >> file1
El operador >>
agrega la salida al archivo nombrado o crea el archivo nombrado si no existe.
cat file1 file2 > file3
Esto concatena dos o más archivos a uno. Puede tener tantos archivos de origen como necesite. Por ejemplo,
cat *.txt >> newfile.txt
Actualización 20130902
En los comentarios, eumiro sugiere "no intente cat file1 file2 > file1
". La razón por la que esto podría no resultar en el resultado esperado es que el archivo que recibe la redirección se prepara antes de que se ejecute el comando a la izquierda de >
. En este caso, el primer file1
se trunca a la longitud cero y se abre para la salida, luego el comando cat
intenta concatenar el archivo de longitud cero ahora más el contenido del file2
en el file1
. El resultado es que los contenidos originales de file1
se pierden y en su lugar hay una copia de file2
que probablemente no es lo que se esperaba.
Actualización 20160919
En los comentarios, tpartee sugiere vincularse con información / fuentes de respaldo. Para una referencia autorizada, dirijo al amable lector a la página de sh man en linuxcommand.org que dice:
Antes de que se ejecute un comando, su entrada y salida pueden redirigirse usando 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 que se ejecute el comando.
En el caso de ejemplo de cat file1 file2 > file1
el shell realiza primero la redirección 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.
Se puede encontrar una versión más amigable en la que la prioridad de redirección se cubre en forma extensa en el sitio web de Ian Allen en forma de software de Linux. 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 a la cáscara:
$ >out
... crea un archivo vacío llamado out. El shell primero configura la redirección de E / S, luego busca un comando, no encuentra ninguno y completa la operación.
cat
puede ser la solución fácil, pero se vuelve muy lenta cuando resolvemos archivos grandes, find -print
es rescatarte, aunque tienes que 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
Nota : si necesitas usar sudo , haz esto:
sudo bash -c ''cat file2 >> file1''
El método habitual de simplemente anteponer sudo
al comando fallará, ya que la escalada de privilegios no se traslada a la redirección de salida.