Quiero copiar el contenido de cinco archivos en un archivo tal como está. Intenté hacerlo usando cp para cada archivo. Pero eso sobrescribe el contenido copiado del archivo anterior. También intenté
paste -d "\n" 1.txt 0.txt
Y no funcionó.
Quiero que mi script agregue la nueva línea al final de cada archivo de texto.
p.ej. Archivos 1.txt, 2.txt, 3.txt. Poner contenidos de 1,2,3 en 0.txt
Cómo lo hago ?
Respuestas:
Necesita el
cat
comando (abreviatura para concatenar), con redirección de shell (>
) en su archivo de salidafuente
>>
para agregar un archivo a otro, donde se>
sobrescribe el archivo de salida con lo que se le haya dirigido. En cuanto a la nueva línea, ¿hay una nueva línea como primer carácter en el archivo1.txt
? Puedes averiguarlo usandood -c
y viendo si el primer personaje es un\n
.{...}
para la coincidencia de nombre de archivo, ¿entonces quizás las citas estropearon un poco las cosas en su script? Siempre trato de trabajar con cosas como esta usandols
un shell. Cuando obtengo el comando correcto, simplemente lo corto y lo pego en un script tal como está. También puede encontrar la-x
opción útil en sus scripts: hará eco de los comandos expandidos en el script antes de la ejecución.Otra opción, para aquellos de ustedes que todavía se encuentran con esta publicación como lo hice, es usar
find -exec
:En mi caso, necesitaba una opción más sólida que buscara en varios subdirectorios, así que decidí usarla
find
. Desglosándolo:Mire dentro del directorio de trabajo actual.
Solo interesado en archivos, no directorios, etc.
Reduzca el conjunto de resultados por nombre
Ejecute el comando cat para cada resultado. "+" significa que solo
cat
se genera 1 instancia de (thx @gniourf_gniourf)Como se explica en otras respuestas, agregue el contenido codificado al final de un archivo de salida.
fuente
*.txt
debe citar el comodín (de lo contrario, todo elfind
comando, tal como está escrito, es inútil). Otra falla proviene de una idea errónea: el comando que se ejecuta no escat >> 0.txt {}
, perocat {}
. De hecho, su comando es equivalente a{ find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt
(agregué agrupación para que se dé cuenta de lo que realmente está sucediendo). Otra falla es quefind
va a encontrar el archivo0.txt
ycat
se quejará diciendo que el archivo de entrada es el archivo de salida .>> output.file
al final de su comando, para no inducir a nadie (incluido usted) a pensar quefind
se ejecutarácat {} >> output.file
para cada archivo encontrado.-exec cat {} +
lugar de-exec cat {} \;
, de modo que solo una instancia decat
se genera con varios argumentos (+
se especifica mediante POSIX ).find . -type f -exec cat {} + >> outputfile.txt
y no pude entender por qué mi archivo de salida no dejaría de crecer en los conciertos a pesar de que el directorio solo tenía 50 megas. ¡Fue porque seguí agregando outputfile.txt a sí mismo! Así que asegúrese de nombrar ese archivo correctamente o colóquelo en otro directorio por completo para evitar esto.si tiene un cierto tipo de salida, haga algo como esto
fuente
file_1
,file_2
...file_11
, debido al orden natural de cómo se ordenan los archivos.Si todos sus archivos están en un solo directorio, simplemente puede hacer
cat * > 0.txt
Los archivos 1.txt, 2.txt, .. irán a 0.txt
fuente
file_1
,file_2
...file_11
, debido al orden natural de cómo se ordenan los archivos.Encontré esta página porque necesitaba unir 952 archivos en uno solo. Encontré que esto funciona mucho mejor si tienes muchos archivos. Esto hará un bucle para la cantidad de números que necesite y cada uno de ellos usando >> para agregar al final de 0.txt.
fuente
Si todos sus archivos tienen un nombre similar, simplemente puede hacer:
fuente
Otra opción es
sed
:O...
O...
O sin redireccionamiento ...
Tenga en cuenta que la última línea escribe también
merge.txt
(wmerge.txt
¡ no !). Puede usarw"merge.txt"
para evitar confusiones con el nombre del archivo y-n
para la salida silenciosa.Por supuesto, también puede acortar la lista de archivos con comodines. Por ejemplo, en el caso de archivos numerados como en los ejemplos anteriores, puede especificar el rango con llaves de esta manera:
fuente
si sus archivos contienen encabezados y desea eliminarlos en el archivo de salida, puede usar:
fuente
Si el archivo original contiene caracteres no imprimibles, se perderán al usar el comando cat. Usando 'cat -v', los no imprimibles se convertirán en cadenas de caracteres visibles, pero el archivo de salida aún no contendría los caracteres no imprimibles reales en el archivo original. Con una pequeña cantidad de archivos, una alternativa podría ser abrir el primer archivo en un editor (por ejemplo, vim) que maneja caracteres que no se imprimen. Luego maniobra hasta el final del archivo e ingrese ": r second_file_name". Eso atraerá el segundo archivo, incluidos los caracteres que no se imprimen. Lo mismo podría hacerse para archivos adicionales. Cuando todos los archivos hayan sido leídos, ingrese ": w". El resultado final es que el primer archivo ahora contendrá lo que hizo originalmente, más el contenido de los archivos que se leyeron.
fuente
Si desea agregar contenido de 3 archivos en un archivo, el siguiente comando será una buena opción:
Combinará el contenido de todos los archivos en el archivo 4, arrojando la salida de la consola a
/dev/null
.fuente