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.txt
también funcionaría. :-)
Si algunos de sus nombres de archivo contienen ', "o el espacio xargs
fallará debido al problema del separador
En general, nunca corras xargs
sin -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 xargs
es 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 *.txt
fallará. 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 *.txt
no 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, *.txt
por 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 quote
error), 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 -0
opció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.
ls
para esto . Si realmente no puede usarcat *.txt >all.txt
, intenteprintf '%s\0' *.txt | xargs -r0 cat >all
y luegomv all all.txt
evite que el archivo haga referencia a sí mismo.