Linux shellscript combina todos os arquivos sem loop

2

Eu tenho centenas de arquivos em um diretório, existe um comando simples ou canos de comando que eu possa usar para juntá-los? Eu não quero usar nenhum loop.

    
por Der Hochstapler 12.06.2011 / 23:08

4 respostas

5

cat * >/path/to/somewhere

não faça

cat * > toall.txt

porque "toall.txt" é criado antes de o cat ser iniciado e você terá um resultado estranho, "cat" toall.txt em toall.txt.

se quiser cat no diretório atual, você deve usar

cat [some_globbing] > file #or
cat * > .dotted_file

.dotted_file não é expandido por * globbing.

ou por exemplo

(ls *.txt | xargs cat ) > /some/file
    
por 12.06.2011 / 23:15
4

Se não houver muitos muitos arquivos:

cat * > /some/new/file

Caso contrário:

find . -exec cat {} + > /some/new/file
find . -exec cat {} \; > /some/new/file
    
por 12.06.2011 / 23:11
0

Semelhante à sugestão de Ignatio:

rm /the/output && find . -print0 | xargs -0 cat >> /the/output

Sem o uso de xargs, você está apto a aumentar seu tamanho máximo de linha de comando. Sem usar -print0, você potencialmente terá problemas com arquivos que possuem caracteres estranhos (como espaços) nos nomes. Mas isso também é específico do GNU.

    
por 21.06.2011 / 22:01
-1

Isso anexará todos os arquivos ao arquivo:

for file in !(outfile); do
        cat "$file" >> outfile
done    

Você precisa excluir primeiro o arquivo de saída, se existir. Isso, no entanto, não irá capturar os arquivos de pontos. Se você quiser pegá-los também, você pode usar os dois padrões

.??* !(outfile)

para criar sua lista de arquivos. Requer um arquivo de pontos para ter pelo menos comprimento 3, portanto, exclui. e ..!

    
por 17.06.2011 / 16:12