Respuestas:
ls *.txt | xargs cat >> all.txt
podría funcionar un poco mejor, ya que se agregaría a all.txt en lugar de crearlo nuevamente después de cada archivo.
Por cierto, cat *.txt >all.txttambién funcionaría. :-)
Si algunos de sus nombres de archivo contienen ', "o el espacio xargsfallará debido al problema del separador
En general, nunca corras xargssin -0, ya que volverá y te morderá algún día.
Considere usar GNU Parallel en su lugar:
ls *.txt | parallel cat > tmp/all.txt
o si lo prefieres:
ls *.txt | parallel cat >> tmp/all.txt
Obtenga más información sobre GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
all.txt es un archivo en el mismo directorio, por lo que cat se confunde cuando quiere escribir desde el mismo archivo en el mismo archivo.
Por otra parte:
ls *.txt | xargs cat > tmp/all.txt
Esto se leerá de los archivos de texto en su directorio actual en all.txt en un subdirectorio (no incluido con *.txt).
También puede encontrar una limitación de longitud de línea de comando. Parte del motivo de uso xargses que divide la entrada en fragmentos seguros del tamaño de una línea de comandos. Entonces, imagine una situación en la que tiene cientos de miles de archivos .txt en el directorio. ls *.txtfallará. Necesitarías hacer
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$en este caso es una expresión regular que coincide con todo lo que termina en .txt (por lo que no es exactamente igual *.txt, ya que si tiene un archivo llamado atxt, entonces *.txtno coincidiría, pero la expresión regular sí lo haría).
El uso de otra ruta se debe a que, como han señalado otras respuestas, all.txt coincide con el patrón, *.txtpor lo que habría un conflicto entre la entrada y la salida.
Tenga en cuenta que si tiene algún archivo con 'su nombre (y esta puede ser la causa del unmatched single quoteerror), querrá hacer
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
La opción --null le dice a grep que use la salida separada por un carácter \0(también conocido como nulo) en lugar de la nueva línea predeterminada, y la -0opción `xargs le dice que espere su entrada en el mismo formato. Esto funcionaría incluso si tuviera nombres de archivo con nuevas líneas en ellos.
lspara esto . Si realmente no puede usarcat *.txt >all.txt, intenteprintf '%s\0' *.txt | xargs -r0 cat >ally luegomv all all.txtevite que el archivo haga referencia a sí mismo.