¿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

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.Respuestas:
ls *.txt | xargs cat >> all.txtpodrí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. :-)fuente
Si algunos de sus nombres de archivo contienen ', "o el espacio
xargsfallará debido al problema del separadorEn general, nunca corras
xargssin -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.txtes 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
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.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*.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 delunmatched single quoteerror), 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-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.fuente