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.txt
funzionerebbe anche. :-)
Se alcuni dei nomi dei tuoi file contengono "," o lo spazio xargs
non riuscirà a causa del problema del separatore
In generale, non correre mai xargs
senza -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 *.txt
avrà 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 *.txt
non corrisponderebbe, ma l'espressione regolare lo farebbe.)
L'uso di un altro percorso è perché, come hanno sottolineato altre risposte, all.txt è associato al modello, *.txt
quindi 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 quote
dell'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' -0
opzione `xargs dice che si aspetta che il suo input sia nello stesso formato. Funzionerebbe anche se avessi nomi di file con newline in essi.
ls
per questo . Se davvero non puoi usarlo,cat *.txt >all.txt
provaprintf '%s\0' *.txt | xargs -r0 cat >all
e poimv all all.txt
per evitare che il file faccia riferimento a se stesso.