我的程序每 30 秒左右将其状态写入几个文件(覆盖),我想用像“更多”那样显示的文件名来查看它们。喜欢:
$ echo 1234 > test00
$ echo 5678 > test01
$ ls
test00 test01
$ more *
::::::::::::::
test00
::::::::::::::
1234
::::::::::::::
test01
::::::::::::::
5678
对于“更多”,您必须按空格才能获取下一个文件。
- 我想要的是内容之前的文件名以某种方式
- 我尝试了“tail”,但必须Ctrl+ C,可以编写一个小程序,但我想知道是否有任何标准的unix程序可以做到这一点(显示文件名,后跟文件内容),而无需像“更多”那样进行进一步的用户交互
答案1
如果输出more
可以接受,只需将其通过管道传输cat
:
more * | cat
这将消除“更多”提示。
printf
或者,您可以使用一行代码对显示进行更多控制:
for fn in *; do printf "::::::\n$fn\n:::::\n"; cat "$fn"; done
或作为脚本:
for fn in $*;
do
printf "vvvvvvvvvv\n$fn\n^^^^^^^^^^\n"
cat "$fn"
done
答案2
你可以做一些事情。
head
和tail
都指定默认显示文件的前十行 - 但如果使用多个参数调用,将为所有行执行此操作并显示每个文件的文件名。当然,对于每个行,您可以使用参数-n[num]
来指定除您想要显示的默认十行之外的行数。我假设您的 CTRL-C 问题与该-f
选项有关- 该选项将指示tail
跟踪文件 - 您可能应该将其忽略。
您可能会做的另一件事 - 这将导致输出与问题中的略有不同,但您可能仍然喜欢,是......
grep -F '' ./*files
grep
当给定多个文件名参数时,还指定显示其匹配的文件名 - 但grep
在每行的开头显示。喜欢
seq 10 >nums.txt; grep -F '' /dev/null nums.txt
...打印...
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
...并在我的终端上突出显示。这/dev/null
只是一个小技巧,即使在仅处理单个文件时也可以强制执行多个文件参数行为,并且grep -F ''
匹配每一行 - 即使是空白行。
这是head /dev/null nums.txt
:
==> /dev/null <==
==> nums.txt <==
1
2
3
4
5
6
7
8
9
10
tail
在这种情况下,输出是相同的 - 但是,同样,这两个实用程序仅打印文件的这么多行。
使用最新版本的 GNU,sed
您可以使用F
以下命令:
sed -s 1F ./*files
...或者如果您想要文件名周围有一些边框...
sed -se '1!b;i\\n---' -e 'F;i\---\n' nums.txt
...确实喜欢...
---
nums.txt
---
1
2
3
4
5
6
7
8
9
10
或者如果你想冒险的话你可以......
tar -c ./*files | tr -s \\0 | cut -d '' -f1,2,13 | tr '\0' '\n'
...但这可能不切实际。
答案3
我会用awk
:
awk 'FNR==1{print "::::\n"FILENAME"\n::::"}1' *
答案4
替代cat
品bat
提供了多个文件内容的非常好的视图,包括文件名、分隔符和行号:
$ printf '%s\n' 1234 > test00
$ printf '%s\n' 5 67 8 > test01
$ bat test*
───────┬───────────────────────────────────────
│ File: test00
───────┼───────────────────────────────────────
1 │ 1234
───────┴───────────────────────────────────────
───────┬───────────────────────────────────────
│ File: test01
───────┼───────────────────────────────────────
1 │ 5
2 │ 67
3 │ 8
───────┴───────────────────────────────────────