display filename followed by content without interaction

My program writes it state to few files every 30 seconds or so (overwrites) and I would like to look at them with the filenames displayed like “more” does. Like:

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

For “more” you have to press space to get next file.

  • What I want is the filenames before content in some way
  • I tried “tail”, but have to Ctrl+C,
    Can write a small program but I’m wondering if any standard unix program can do this ( display name of file, followed by content of file ) without further user interaction as with “more”
Asked By: AlfredoG

||

If the output from more is acceptable as it is, just pipe it through cat:

more * | cat

That will do away with the “more” prompts.

Or you can get a bit more control over the display using printf in a one-liner:

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

or as script:

for fn in $*; 
do 
   printf "vvvvvvvvvvn$fnn^^^^^^^^^^n"
   cat "$fn"
done
Answered By: Anthon

I would use awk:

awk 'FNR==1{print "::::n"FILENAME"n::::"}1' *
Answered By: jimmij

You can do a few things.

head and tail are both spec’d to display the first/last ten lines of a file by default – but if called w/ multiple arguments will do that for all and display the filenames for each. And, of course, for each, you can use the -n[num] argument to specify a number of lines other than the default ten that you would like to display. I assume your CTRL-C problem was related to the -f option – which would instruct tail to follow a file – you probably should just leave that out.

Another thing you might do – which will result in output a little different than in the question, but which you might still like, is…

grep -F '' ./*files

grep is also spec’d to display the filename for its matches when it is given multiple filename arguments – but grep does it at the head of every line. Like

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

…which prints…

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

…and highlighted on my terminal. The /dev/null thing is just a little trick to force the multiple file arg behavior even when working with only a single file, and grep -F '' matches every line – even blank ones.

And here’s head /dev/null nums.txt:

==> /dev/null <==

==> nums.txt <==
1
2
3
4
5
6
7
8
9
10

tail‘s output is identical in this case – but, again, both utilities only print so many lines of a file.

With the latest version of GNU sed you can use the F command like:

sed -s 1F ./*files

…or if you wanted a little border around the filename…

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

…which does like…

---
nums.txt
---

1
2
3
4
5
6
7
8
9
10

Or if you wanted to get adventurous you could do…

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

…but that’s probably not practical.

Answered By: mikeserv

The cat replacement bat provides a really nice view of the contents of multiple files, with file names, separators, and line numbers:

$ printf '%sn' 1234 > test00

$ printf '%sn' 5 67 8 > test01

$ bat test*
───────┬───────────────────────────────────────
       │ File: test00
───────┼───────────────────────────────────────
   1   │ 1234
───────┴───────────────────────────────────────
───────┬───────────────────────────────────────
       │ File: test01
───────┼───────────────────────────────────────
   1   │ 5
   2   │ 67
   3   │ 8
───────┴───────────────────────────────────────
Answered By: dimo414
Categories: Answers Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.