Filenames

顯示文件名後跟內容而不進行互動

  • April 17, 2020

我的程序每 30 秒左右將狀態寫入幾個文件(覆蓋),我想用顯示的文件名來查看它們,就像“更多”一樣。像:

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

對於“更多”,您必須按空格來獲取下一個文件。

  • 我想要的是內容之前的文件名以某種方式
  • 我嘗試了“tail”,但必須Ctrl+ C,可以編寫一個小程序,但我想知道是否有任何標準的 unix 程序可以做到這一點(顯示文件名,後跟文件內容),而無需像“更多”那樣進行進一步的使用者互動

如果輸出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

你可以做幾件事。

head並且tail預設情況下都指定顯示文件的前十行/最後十行 - 但如果呼叫 w/ 多個參數,將為所有參數執行此操作並顯示每個文件的文件名。當然,對於每一個,您可以使用-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只是一個小技巧,即使只使用單個文件,也可以強制執行多文件 arg 行為,並且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'

…但這可能不切實際。

引用自:https://unix.stackexchange.com/questions/185072