¿Por qué esto no funciona?
ls *.txt | xargs cat > all.txt
(Quiero unir el contenido de todos los archivos de texto en un solo archivo 'all.txt'). Encontrar con -exec también debería funcionar, pero realmente me gustaría entender la sintaxis de xargs.
Gracias
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.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. :-)fuente
Si algunos de sus nombres de archivo contienen ', "o el espacio
xargs
fallará debido al problema del separadorEn general, nunca corras
xargs
sin -0, ya que volverá y te morderá algún día.Considere usar GNU Parallel en su lugar:
o si lo prefieres:
Obtenga más información sobre GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
fuente
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:
Esto se leerá de los archivos de texto en su directorio actual en all.txt en un subdirectorio (no incluido con
*.txt
).fuente
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.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 llamadoatxt
, 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 delunmatched single quote
error), querrá hacerLa 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.fuente