Respostas:
ls *.txt | xargs cat >> all.txt
pode funcionar um pouco melhor, pois seria anexado a all.txt em vez de criá-lo novamente após cada arquivo.
By the way, cat *.txt >all.txttambém funcionaria. :-)
Se alguns dos nomes de arquivos contiverem ', "ou o espaço xargsfalhará devido ao problema do separador
Em geral, nunca corra xargssem -0, pois ele voltará e o morderá um dia.
Considere usar o GNU Parallel:
ls *.txt | parallel cat > tmp/all.txt
ou se você preferir:
ls *.txt | parallel cat >> tmp/all.txt
Saiba mais sobre o GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
all.txt é um arquivo no mesmo diretório; portanto, o gato fica confuso quando deseja gravar do mesmo arquivo no mesmo arquivo.
Por outro lado:
ls *.txt | xargs cat > tmp/all.txt
Isso lerá de arquivos de texto no seu diretório atual para o all.txt em um subdiretório (não incluído no *.txt).
Você também pode encontrar uma limitação de comprimento de linha de comando. Parte do motivo do uso xargsé que ele divide a entrada em blocos seguros do tamanho da linha de comando. Então, imagine uma situação em que você tenha centenas de milhares de arquivos .txt no diretório. ls *.txtvai falhar. Você precisaria fazer
ls | grep .txt$ |xargs cat > /some/other/path/all.txt
.txt$nesse caso, é uma expressão regular que corresponde a tudo que termina em .txt (portanto, não é exatamente como *.txt, pois se você tiver um arquivo chamado atxt, *.txtele não corresponderia, mas a expressão regular seria).
O uso de outro caminho é porque, como outras respostas apontaram, all.txt é correspondido pelo padrão, *.txtportanto, haveria um conflito entre entrada e saída.
Observe que, se você tiver algum arquivo com 'seus nomes (e isso pode ser a causa do unmatched single quoteerro), convém fazer isso
ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt
A opção --null diz ao grep para usar a saída separada por um caractere \0(nulo) em vez da nova linha padrão, e a -0opção `xargs diz para esperar sua entrada no mesmo formato. Isso funcionaria mesmo se você tivesse nomes de arquivos com novas linhas.
lspara isso . Se você realmente não pode usarcat *.txt >all.txt, em seguida, tentarprintf '%s\0' *.txt | xargs -r0 cat >alle, em seguida,mv all all.txtpara evitar que o arquivo de referência em si.