¿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.txt
Solo 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
type
puede hacer esto:El
type
comando 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
copy
para 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 | grep
negativo , porque es un antipatrón muy malo).ls *.txt
fallarí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
cat
método anterior concatenará la última línea y la primera línea de los archivos adyacentes.¿Qué tal este enfoque?
fuente
-maxdepth 1
alfind
comando.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.txt
Si
{}
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 \;