¿Cuál es la forma más rápida y pragmática de combinar todos los archivos * .txt en un directorio en un archivo de texto grande?
Actualmente estoy usando Windows con Cygwin, así que tengo acceso a BASH.
El comando de shell de Windows también sería bueno, pero dudo que haya uno.

echo *.txt | xargs cat > all.txtSolo recuerde, para todas las soluciones dadas hasta ahora, el shell decide el orden en que se concatenan los archivos. Para Bash, IIRC, ese es el orden alfabético. Si el orden es importante, debe nombrar los archivos adecuadamente (01file.txt, 02file.txt, etc.) o especificar cada archivo en el orden en que desea concatenarlo.
fuente
El comando de shell de Windows
typepuede hacer esto:El
typecomando Tipo también escribe nombres de archivo en stderr, que no son capturados por el>operador de redireccionamiento (pero aparecerán en la consola).fuente
Puede usar el shell de Windows
copypara concatenar archivos.De la ayuda:
fuente
Tenga cuidado, porque ninguno de estos métodos funciona con una gran cantidad de archivos. Personalmente, usé esta línea:
EDITAR: como alguien dijo en los comentarios, puede reemplazar
$(ls | grep ".txt")con$(ls *.txt)EDITAR: gracias a la experiencia de @gnourf_gnourf, el uso de glob es la forma correcta de iterar sobre los archivos en un directorio. En consecuencia, las expresiones blasfemas como
$(ls | grep ".txt")deben ser reemplazadas por*.txt(ver el artículo aquí ).Buena solución
fuente
for i in $(ls *.txt);do cat $i >> output.txt;done?ls | grepnegativo , porque es un antipatrón muy malo).ls *.txtfallaría si hay demasiados archivos (la lista de argumentos es demasiado larga)?La forma más pragmática con el shell es el comando cat. otras formas incluyen,
fuente
catmétodo anterior concatenará la última línea y la primera línea de los archivos adyacentes.¿Qué tal este enfoque?
fuente
-maxdepth 1alfindcomando.sort -u --output="$OUTPUT_FILE" --files0-from=- < <(find "$DIRECTORY_NAME" -maxdepth 1 -type f -name '*.txt' -print0)Por ejemplo:
Eso tomará todos los archivos txt en la carpeta C: \ y lo guardará en la carpeta C: \ 1 con el nombre de all.txt
O
Por ejemplo:
Eso tomará todos los archivos que están presentes en la carpeta y colocará Contenido en C: \ 1 \ all.txt
fuente
Puedes hacer así:
cat [directory_path]/**/*.[h,m] > test.txtSi
{}suele incluir la extensión de los archivos que desea buscar, hay un problema de secuencia.fuente
Cuando se encuentra con un problema en el que se conecta all.txt a all.txt, puede intentar verificar si all.txt existe o no, si existe, elimine
Me gusta esto:
[ -e $"all.txt" ] && rm $"all.txt"fuente
cat *.txt > all.txt>el comando sobrescribe all.txt si existe>>agrega datos al archivo existentetodo eso es desagradable ...
cosas fáciles
fuente
find . -iname "*.txt" -maxdepth 1 -exec cat {} >> out.txt \;