ファイル名の後にコンテンツが表示され、対話は必要ありません。

ファイル名の後にコンテンツが表示され、対話は必要ありません。

私のプログラムは、30秒ごとに複数のファイルに状態を記録し(上書き)、「more」などの表示されたファイル名でそのファイルを表示したいと思います。良い:

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

「もっと見る」の場合、次のファイルを表示するにはスペースバーを押す必要があります。

  • 私が望むのは何とか内容の前のファイル名です
  • 「tail」を試しましたが、Ctrl+をしなければなりませんでしたC。小さなプログラムを書くことは可能ですが、「このようなことをしなくても、このタスク(ファイル名とファイルの内容を表示)を実行できる標準のUnixプログラムがあるかどうか疑問に思います。

答え1

出力がmore許可されている場合はパイプしますcat

more * | cat

これにより、「追加」プロンプトが削除されます。

printfまたは、1行のコードでディスプレイをより効果的に制御できます。

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とも、デフォルトでファイルの最初の10行が表示されることを指定します。ただし、複数の引数で呼び出すと、すべての行に対してこれが行われ、各ファイルのファイル名が表示されます。もちろん、各行にパラメータを使用して、表示するデフォルトの-n[num]10行に加えて行数を指定できます。私はあなたの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
───────┴───────────────────────────────────────

関連情報