Linux: gato com separadores entre arquivos

28

No Linux, se você digitar cat *, obterá algo como isto:

linha1 do arquivo1
linha2 do arquivo1
linha1 do arquivo2
linha1 do arquivo3
linha2 do arquivo3
linha3 do arquivo3

O que eu gostaria é exibir um separador entre arquivos. Algo assim:
linha1 do arquivo1
linha2 do arquivo1
XXXXXXXXXXXX
linha1 do arquivo2
XXXXXXXXXXXX
linha1 do arquivo3
linha2 do arquivo3
linha3 do arquivo3

Isso é facilmente possível com uma linha fácil de digitar de cor?

Daniele
fonte

Respostas:

40

Se você não é muito exigente quanto à aparência do separador:

tail -n +1 *
Gilles 'SO- parar de ser mau'
fonte
Isso é ótimo! Estou surpreso como seu comando é diferente da cauda -n 1 *. Também não consigo encontrar nenhuma menção ao efeito de +1 (maior que 1) na página de manual.
Daniele
11
tail -n Xmostra as últimas X linhas. tail -n +Xcomeça na linha X e começa em 1 , ou seja, mostra todas, exceto as primeiras (X-1) linhas.
Gilles 'SO- stop be evil'
Ah, agora eu posso ver isso na página de manual. Eu ignorei isso. Grandes, graças um bando
Daniele
Soluções semelhantes estão neste artigo: everythingsysadmin.com/2012/09/unorthodoxunix.html
TomOnTime 4/14
Desculpe pelo comentário ruim, mas isso é incrível. Obrigado, @Gilles
Mike D
17

cd /to/your/directory; for each in *; do cat $each; echo "XXXXXXXXXXX"; done

Janne Pikkarainen
fonte
me derrote :-)
Sirex
Ainda assim, a solução fornecida por Gilles é impressionantemente curta!
Janne Pikkarainen
Uau. funciona maravilha. Ajudou-me a concatenar uma pasta de JSONs
Chandak
11
awk 'FNR==1 && NR!=1 {print "XXXXXXXXXXXX"}{print}' *

Ou

awk 'FNR==1 {print "XXXXXX", FILENAME, "XXXXXX"}{print}' *

Ou

awk 'FNR==1 {print "XXXXXX File no. " ++count, "XXXXXX"}{print}' *

Usando apenas Bash (não cat):

for file in *; do printf "$(<"$file")\nXXXXXXXXXXXX\n"; done

Editar:

No AWK 4:

awk 'BEGINFILE {print "XXXXXXXXXXXX"}{print}' *

Você pode usar qualquer separador, como os dos outros exemplos nesta resposta. Se você deseja o separador no final de cada arquivo, mude BEGINFILEpara ENDFILE. Ele ainda pode aparecer no início do script, pois é uma ordem condicional (em vez de implicar em execução).

Pausado até novo aviso.
fonte
2
+1 para awk! Eu juro que pode fazer qualquer coisa ...
brad