Risposte:
ls *.txt | xargs cat >> all.txt
potrebbe funzionare un po 'meglio, poiché si aggiungerebbe a all.txt invece di crearlo nuovamente dopo ogni file.
A proposito, cat *.txt >all.txtfunzionerebbe anche. :-)
Se alcuni dei nomi dei tuoi file contengono "," o lo spazio xargsnon riuscirà a causa del problema del separatore
In generale, non correre mai xargssenza -0 poiché tornerà e ti morderà un giorno.
Prendi invece in considerazione l'utilizzo di GNU Parallel:
ls *.txt | parallel cat > tmp/all.txt
o se preferisci:
ls *.txt | parallel cat >> tmp/all.txt
Ulteriori informazioni su GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
all.txt è un file nella stessa directory, quindi cat si confonde quando vuole scrivere dallo stesso file nello stesso file.
D'altro canto:
ls *.txt | xargs cat > tmp/all.txt
Questo leggerà dai file di testo nella directory corrente in all.txt in una sottodirectory (non inclusa con *.txt).
Potresti anche imbatterti in una limitazione della lunghezza della riga di comando. Parte del motivo dell'uso xargsè che suddivide l'input in blocchi sicuri delle dimensioni di una riga di comando. Quindi, immagina una situazione in cui hai centinaia di migliaia di file .txt nella directory. ls *.txtavrà esito negativo. Dovresti fare
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$in questo caso è un'espressione regolare che corrisponde a tutto ciò che termina in .txt (quindi non è esattamente come *.txt, poiché se si dispone di un file chiamato atxt, allora *.txtnon corrisponderebbe, ma l'espressione regolare lo farebbe.)
L'uso di un altro percorso è perché, come hanno sottolineato altre risposte, all.txt è associato al modello, *.txtquindi ci sarebbe un conflitto tra input e output.
Nota che se hai dei file con i 'loro nomi (e questa potrebbe essere la causa unmatched single quotedell'errore), dovresti farlo
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
L'opzione --null dice a grep di usare l'output separato da un carattere \0(aka null) invece della newline predefinita, e l' -0opzione `xargs dice che si aspetta che il suo input sia nello stesso formato. Funzionerebbe anche se avessi nomi di file con newline in essi.
lsper questo . Se davvero non puoi usarlo,cat *.txt >all.txtprovaprintf '%s\0' *.txt | xargs -r0 cat >alle poimv all all.txtper evitare che il file faccia riferimento a se stesso.