
Tengo una carpeta grande que contiene muchos subdirectorios, cada uno con muchos .txt
archivos. Quiero concatenar todos estos archivos en un solo .txt
archivo. Puedo hacerlo para cada uno de los subdirectorios con cat *.txt>merged.txt
, pero intento hacerlo para todos los archivos de la carpeta grande. ¿Cómo hago esto?
Respuesta1
prueba con
find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile
busque todos los archivos '*.txt' f
de /path/to/source
forma recursiva para los subdirectorios y concatenelos todos en uno mergedfile
.
Para concatenar los archivos de cada subdirectorio dentro de su directorio, haga:
find . -mindepth 1 -type d -execdir sh -c 'cat $1/*.txt >> $1/mergedfile' _ {} \;
Respuesta2
Si está utilizando Bash y la cantidad de archivos de texto está contenida (es decir, no excede el límite máximo de número de argumentos, que es muy grande pero no infinito), puede lograrlo fácilmente con la globstar
función:
$ shopt -s globstar
$ cat **/*.txt > merged.txt
Un enfoque más general, aunque menos elegante, será utilizarlo find
como controlador y hacer que llame cat
a cada archivo, añadiendo el resultado:
$ find -name \*.txt -exec sh -c 'cat {} >> merged.out' \;
Es necesario realizar una llamada sh
aquí porque desea agregar el resultado de cada uno cat
. Asegúrese de que el archivo de salida tenga una extensión diferente o se encuentre fuera del árbol que está fusionando, o find
puede intentar concatenar la salida consigo mismo.
Respuesta3
Si tiene que realizar la concatenación en un orden particular, lo siguiente concatenará los archivos en orden lexicográfico (ordenados por nombres de ruta) en bash
:
shopt -s globstar
for name in **/*.txt; do
[ -f "$name" ] && cat <"$name"
done >merged.out
Esto es similar al find
comando
find . -type f -name '*.txt' -exec cat {} ';' >merged.out
excepto que el orden puede ser diferente, se incluirían enlaces simbólicos a archivos normales (agregue un && [ ! -L "$name" ]
si no los desea) y se excluirían los archivos ocultos (y los archivos en directorios ocultos) (úselos shopt -s dotglob
para volver a agregarlos).