exibe nome do arquivo seguido por conteúdo sem interação

3

Meu programa o grava em poucos arquivos a cada 30 segundos (sobrescreve) e eu gostaria de vê-los com nomes de arquivos exibidos como "mais". Como:

$ echo 1234 > test00
$ echo 5678 > test01
$ ls
test00  test01
$ more *
::::::::::::::
test00
::::::::::::::
1234
::::::::::::::
test01
::::::::::::::
5678

Para "mais" você precisa pressionar espaço para obter o próximo arquivo.

  • O que eu quero é os nomes de arquivos antes de algum conteúdo
  • Eu tentei "tail", mas tenho que Ctrl + C , Posso escrever um programa pequeno, mas estou pensando se algum programa unix padrão pode fazer isso (exibir o nome do arquivo, seguido pelo conteúdo do arquivo) sem mais interação do usuário, como com "mais"
por AlfredoG 16.02.2015 / 07:43

3 respostas

5

Se a saída de more for aceitável, envie-a por cat :

more * | cat

Isso eliminará os "mais" prompts.

Ou você pode ter um pouco mais de controle sobre a exibição usando printf em uma linha:

for fn in *; do printf "::::::\n$fn\n:::::\n"; cat "$fn"; done

ou como script:

for fn in $*; 
do 
   printf "vvvvvvvvvv\n$fn\n^^^^^^^^^^\n"
   cat "$fn"
done
    
por 16.02.2015 / 07:48
3

Eu usaria awk :

awk 'FNR==1{print "::::\n"FILENAME"\n::::"}1' *
    
por 16.02.2015 / 10:06
3

Você pode fazer algumas coisas.

head e tail são ambos especificados para exibir as dez / últimas linhas de um arquivo por padrão - mas se chamado w / multiple arguments fará isso para todos e exibirá os nomes dos arquivos para cada um. E, é claro, para cada um, você pode usar o argumento -n[num] para especificar um número de linhas diferentes das dez padrão que você gostaria de exibir. Eu suponho que seu problema CTRL-C estava relacionado à opção -f - que instruiria tail a seguir um arquivo - você provavelmente deveria deixar isso de lado.

Outra coisa que você pode fazer - que resultará em um resultado um pouco diferente do que na pergunta, mas que você ainda pode gostar, é ...

grep -F '' ./*files

grep também é especificado para exibir o nome do arquivo para suas correspondências quando recebe vários argumentos de nome de arquivo - mas grep faz isso na cabeça de cada linha. Como

seq 10 >nums.txt; grep -F '' /dev/null nums.txt

... que imprime ...

nums.txt:1
nums.txt:2
nums.txt:3
nums.txt:4
nums.txt:5
nums.txt:6
nums.txt:7
nums.txt:8
nums.txt:9
nums.txt:10

... e destacado no meu terminal. A coisa /dev/null é apenas um pequeno truque para forçar o comportamento do argumento de vários arquivos, mesmo quando se trabalha com apenas um único arquivo, e grep -F '' corresponde a todas as linhas - mesmo as em branco.

E aqui está o head /dev/null nums.txt :

==> /dev/null <==

==> nums.txt <==
1
2
3
4
5
6
7
8
9
10
A saída de

tail é idêntica neste caso - mas, novamente, ambos os utilitários apenas imprimem tantas linhas de um arquivo.

Com a última versão do GNU sed você pode usar o comando F como:

sed -s 1F ./*files

... ou se você quiser uma pequena borda ao redor do nome do arquivo ...

sed -se '1!b;i\n---' -e 'F;i\---\n' nums.txt

... que gosta ...

---
nums.txt
---

1
2
3
4
5
6
7
8
9
10

Ou se você quisesse ser aventureiro, poderia fazer ...

tar -c ./*files | tr -s \0 | cut -d '' -f1,2,13 | tr '
grep -F '' ./*files
' '\n'

... mas isso provavelmente não é prático.

    
por 16.02.2015 / 10:38