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.txt
também funcionaria. :-)
Se alguns dos nomes de arquivos contiverem ', "ou o espaço xargs
falhará devido ao problema do separador
Em geral, nunca corra xargs
sem -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 *.txt
vai 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
, *.txt
ele 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, *.txt
portanto, 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 quote
erro), 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 -0
opção `xargs diz para esperar sua entrada no mesmo formato. Isso funcionaria mesmo se você tivesse nomes de arquivos com novas linhas.
ls
para isso . Se você realmente não pode usarcat *.txt >all.txt
, em seguida, tentarprintf '%s\0' *.txt | xargs -r0 cat >all
e, em seguida,mv all all.txt
para evitar que o arquivo de referência em si.