Por que isso não funciona?
ls *.txt | xargs cat > all.txt
(Quero juntar o conteúdo de todos os arquivos de texto em um único arquivo 'all.txt'.) O achado com -exec também deve funcionar, mas eu realmente gostaria de entender a sintaxe do xargs.
obrigado
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.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. :-)fonte
Se alguns dos nomes de arquivos contiverem ', "ou o espaço
xargs
falhará devido ao problema do separadorEm geral, nunca corra
xargs
sem -0, pois ele voltará e o morderá um dia.Considere usar o GNU Parallel:
ou se você preferir:
Saiba mais sobre o GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ
fonte
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:
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
).fonte
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.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 chamadoatxt
,*.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 dounmatched single quote
erro), convém fazer issoA 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.fonte