我的程序每 30 秒左右将它的状态写入几个文件(覆盖),我想用像“更多”那样显示的文件名来查看它们。喜欢:
$ echo 1234 > test00
$ echo 5678 > test01
$ ls
test00 test01
$ more *
::::::::::::::
test00
::::::::::::::
1234
::::::::::::::
test01
::::::::::::::
5678
Run Code Online (Sandbox Code Playgroud)
对于“更多”,您必须按空格才能获取下一个文件。
如果输出more是可以接受的,只需通过管道传输cat:
more * | cat
Run Code Online (Sandbox Code Playgroud)
这将消除“更多”提示。
或者,您可以使用printf单行对显示进行更多控制:
for fn in *; do printf "::::::\n$fn\n:::::\n"; cat "$fn"; done
Run Code Online (Sandbox Code Playgroud)
或作为脚本:
for fn in $*;
do
printf "vvvvvvvvvv\n$fn\n^^^^^^^^^^\n"
cat "$fn"
done
Run Code Online (Sandbox Code Playgroud)
你可以做几件事。
head并且tail都规范默认显示文件的前十行/最后十行 - 但如果调用带有多个参数,则将为所有行执行此操作并显示每个文件的文件名。而且,当然,对于每个,您可以使用-n[num]参数指定要显示的默认十行以外的行数。我假设您的 CTRL-C 问题与-f选项有关 - 它会指示tail跟随文件 - 您可能应该忽略它。
您可能会做的另一件事 - 这将导致输出与问题略有不同,但您可能仍然喜欢,是......
grep -F '' ./*files
Run Code Online (Sandbox Code Playgroud)
grep还指定了在给定多个文件名参数时显示其匹配项的文件名 - 但grep在每一行的开头执行。喜欢
seq 10 >nums.txt; grep -F '' /dev/null nums.txt
Run Code Online (Sandbox Code Playgroud)
...打印...
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
Run Code Online (Sandbox Code Playgroud)
...并在我的终端上突出显示。这/dev/null只是一个小技巧,即使在仅处理单个文件时也可以强制执行多个文件 arg 行为,并grep -F ''匹配每一行 - 甚至是空白行。
这是head /dev/null nums.txt:
==> /dev/null <==
==> nums.txt <==
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)
tail在这种情况下, 的输出是相同的 - 但是,同样,这两个实用程序只打印文件的这么多行。
使用最新版本的 GNU,sed您可以使用如下F命令:
sed -s 1F ./*files
Run Code Online (Sandbox Code Playgroud)
...或者如果你想在文件名周围加一点边框......
sed -se '1!b;i\\n---' -e 'F;i\---\n' nums.txt
Run Code Online (Sandbox Code Playgroud)
......这确实喜欢......
---
nums.txt
---
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)
或者,如果你想冒险,你可以...
tar -c ./*files | tr -s \\0 | cut -d '' -f1,2,13 | tr '\0' '\n'
Run Code Online (Sandbox Code Playgroud)
...但这可能不切实际。