【Linux】more コマンドの使い方、意外な使い所【ファイル連結】
目次
皆様こんにちは。
家電を買う際に新品か中古かで非常に悩みがちな、システムソリューション部所属のなかです。
さて、Linux 環境でファイルを閲覧するときのコマンドといえば、「less」「cat」「view」etc……
そして今回ご説明する「more」が存在しています。
「more」コマンドをご存知ない方は、「どんなコマンド?」「他のコマンドとどう違う?」
そしてご存知の方は「more 使わないな」「他のコマンドと比べるとあまり……」と思われる方が多いでしょう。
「more の基本的な使い方」を説明しつつ、「何故利用率が低いのか」「more の使い所」といった事に関して、筆者の見解や提案をご紹介いたします。
ひとまず結論だけ先に述べると、普段使いではなく仕様を使ってファイルを連結する際に便利です。
テスト環境
- Linux 環境
「OS:Ubuntu 20.04.5 LTS(WSL2環境)」
・Shell:Bash
・ロケールを日本語に変更
more コマンドの使い方 / 操作方法
more [オプション] ファイル名 ※オプションは省略可能です
使い方は、一般的なエディターやビューワーと同じく ファイル名(相対・絶対パスでも可能)を指定するだけです。
実行すると「画面(コンソール)のサイズに収まる範囲の内容が表示」されます。
more と less は、ファイルの情報を一定の行数で表示させていく「ページャ」と呼ばれる機能です。
主なオプション
+数値 | 指定した数値の行から表示する。 |
-l | 改ページを無視して表示する。 more は通常 ^L(改行) があると、一旦次の行で停止しますがその機能を無効化します。 |
-f | 画面上の行数ではなく、データ上の行数で表示する。
長い1行があると画面上で折り返して1行ずつ表示しますが、画面上で折り返した複数行を、まとまった1行として同時に表示する挙動になります。 |
-s | 連続した空行を1行で表示させます。 |
-d | 操作状態で無効なキーが入力された際にビープ音ではなく、操作方法に関するヘルプ文を表示させます。 |
-数値 | 指定した数値の行数ずつ表示する。 |
※ man コマンドで確認した more のオプション説明と実際の挙動を確認。
一般的に使いそうなオプションのみ記載しています。
実行時の挙動
■ ファイル内容が一度の表示で画面に収まる場合
$ more testfile test text ※「test text」の1行のみ記載されているサンプルファイル
行数がコンソール内で収まる場合は単にそのまま出力され、即座にコマンドは実行完了となります。
コンソール内で表示しきれるなら cat コマンドのオプション無しと差はありません。
■ ファイル内容が一度の表示で画面に収まらない場合(一般的な利用状態)
$ more testfile_long 1 2 3 4 5 6 7 8 9 10 --続きます--(40%) ※1から順に数字だけ記載されているサンプルファイル
コンソールの表示領域内に収まらない行数の場合、収まる行数だけ全体で表示されます。
more は上記状態が実行中で、サブコマンドを受け付ける対話的な状態です。
対話的な状態では、less や view と似た挙動になります。
Enter では未表示部分を一行ずつ、Space では画面サイズ毎に次を表示させますが、全てを表示しきると完了となって「$」(プロンプト)が表示される実行前の状態に戻ります。
操作方法 (主な対話的コマンド)
「k」は任意の10進数です。
例えば「z」を押せば、画面行数分一気に表示が進みますが、「1z」と入力すると「1行先を表示する」動作になります。
h,? | ヘルプ機能。 サブコマンドの一覧&解説を表示する。 |
SPACE | k行先を表示する。 デフォルトは現在の画面行数。 |
z | k 行先を表示する。 デフォルトは現在の画面行数。 引数が新しいデフォルトになる。 |
RETURN(Enter) | k 行先を表示する。デフォルトは 1。 引数が新しいデフォルトになる。 |
s | k 行先にスキップする。(スクロールではないため、スキップ先が一番上になります) デフォルトは 1。 |
f | k 回画面をスクロールする。(画面単位のため、表示が全て変わります) デフォルトは 1 。 |
b | k 回画面をバックスクロールする。(画面単位のため、表示が全て変わります) デフォルトは 1 。 |
= | 現在の行数(行番号)を表示する。 |
/pattern | 正規表現で k 回目に合致する文字列を検索する。 デフォルトは1。 |
q | 終了する。 |
more コマンド、現代では「使いにくい」件
誤解、というか知られていない事がありますが、more は表示を戻すことができます。
現在ではサブコマンドの「b」で後方移動が可能です。(念押し)
ただし、実装直後の時代では「表示が進むだけで戻れない」という仕様のため、現在もその情報や誤解が残っているようです。
「/」を使った検索も可能で、必要な機能は一通り揃っています。
……といっても、それ以外の仕様で悩みどころがあります。
悩みどころ
・「全て表示しきると操作が終了する」
最後まで内容を見てから、最初の方の内容を見ようと思っても操作が終了しています。
・「一度に表示しきれると操作できないため、cat と変わらない」
軽く表示しながら検索したいという場合にこの仕様は不便です。
・「行番号を全体表示できない」
「cat -n」「less -N」のように全体的に行番号を並列して表示するオプションがありません。
これらの特徴によって普段使うコマンドとしては「more」をあえて使う理由は薄いと言わざる得ないでしょう。
一般的に「 less か view で良いかな」 という結論になるのはこういった理由からだと思います。
Tips:そもそも「less」が「more」を改善して生まれた後発コマンド
「表示が進むだけで戻らない仕様」であった、初期の「more」コマンドの改善を意図し、後発で生まれたのが「less」となります。(コマンド制作者の方のHPより)
less の man ページの説明を見てみましょう。
【説明】
less は more (1) と同様なプログラムであるが、 ファイル内での前方移動と同様に後方移動も可能となっている。また、 less は起動時に入力ファイル全体を読み込む必要がないため、 大きな入力ファイルの場合には vi (1) のようなテキストエディタより起動が速い。
less は termcap(システムによっては terminfo)を使用するため、 多くの端末で実行できる。
ハードコピー端末では、まだサポートが限定されている。(ハードコピー端末では、画面の一番上に表示されるべき行に キャレット (^) が付く)コマンドは more と vi の両方を基本にしている。(以下の説明において N で表す)10進数の後に続けて使用できるコマンドもある。
「less は more (1) と同様なプログラムであるが、 ファイル内での前方移動と同様に後方移動も可能となっている。」
(後方移動できなかった)more を前提とした「後方移動」について明記されています。
more(1978年)
man:1978年に作成されたコマンド ※ 参考資料参照
less:1983年に作成されたコマンド ※ 参考資料参照
Linux 以前の1978年、UNIX の時代に「more」コマンドは当時の現状を改善するために生み出されました。
そして UNIX を含めた OS に正式に採用されたページャ(コマンド)です。
本記事においては、経緯と歴史的な存在に敬意を払いつつ、「現代では less のが利便性が高く普及している」という認識で記載させていただいております。
more コマンドの便利な仕様
そんな「more」ですが、「less」や「view」にはない面白い仕様が存在します。
複数のファイルを開く時に、標準出力内にファイル名も出力される仕様です。
less や view で複数ファイルを開いた際は、ファイル事に表示画面事切り替える形になります。
例えば、1~10までの順列の数字を testA.conf testB.conf の2個に分けたファイルを同時に開いてみます。
■ less で同時に開いた場合
$ less testA.conf testB.conf 1 2 3 4 5 testA.conf (file 1 of 2) (END) - Next: testB.conf ※コマンドライン部分で表示
:n で次のファイルの表示へ移動
6 7 8 9 10 testB.conf (file 2 of 2) (END)※コマンドライン部分で表示
less では単にコマンドラインに情報として出力されます。
※ view では文言が違うだけで形式は同じです。
■ more で同時に開いた場合
$ more testA.conf testB.conf :::::::::::::: testA.conf :::::::::::::: 1 2 3 4 5 --続きます--(次のファイル: testB.conf) ※コマンドライン部分で表示
サブコマンド(Enter や Space)で表示を進めます。
:::::::::::::: testA.conf :::::::::::::: 1 2 3 4 5 :::::::::::::: testB.conf :::::::::::::: 6 7 8 9 10
more では出力内容にファイル名が含まれ、ファイル名の扱い方が違います。
「それの何が良いのか」と思われる方もしれませんが、この仕様が次の「使い所」に繋がります。
more コマンドの使い所
普段は無いかもしれませんが、稀に複数の conf を1個のファイルにまとめたい状況が存在します。
・管理や資料、保存用のため、個別の conf ではなく、一括で検索できる上に保存が、楽な1個のファイルで残したい
過去の経験で1度だけですが、上記の状況になった事があります。
この時に「more」の上記仕様が輝きます。
■ more で連結させた場合
$ more testA.conf testB.conf > testA+C.conf $ cat testA+C.conf :::::::::::::: testA.conf :::::::::::::: 1 2 3 4 5 :::::::::::::: testB.conf :::::::::::::: 6 7 8 9 10
ファイル名が標準出力される仕様のため、連結させる際にファイル名を含めて連結できます。
逆に less を使って file を連結してみましょう。
■ less で連結させた場合
$ less testA.conf testB.conf > testA+C_less.conf $ cat testA+C_less.conf 1 2 3 4 5 6 7 8 9 10
「中身だけで連結されて、ファイルの繋ぎ目がわからない」となり目的を達せません。
結論:普段は使わないけど、ファイル名を含んだ連結をしたい時が使い所
結論として、普段の利用では「less」が便利で使いやすいです。
ただし、「ファイル名も含めて連結したい」という時には「more」が輝く使い所といえます。
逆に「more」を使わない場合
$ for file in testA.conf testB.conf ; do echo "==== $file ====" >> combined.conf; cat $file >> combined.conf; done $ cat combined.conf ==== testA.conf ==== 1 2 3 4 5 ==== testB.conf ==== 6 7 8 9 10
面倒。これを入力するくらいなら「more」の方が確実に楽だと思います。
特に find を組み合わせるなら「more」の方が特に簡単なので、敢えて使わない意味もないかなと思います。
最後に
このブログを書くキッカケとしては、過去にファイル名を含んだ連結に悪戦苦闘したからです。
その中で、more の仕様を使って美しく実現できた時にとても感動しました。
「仕様を理解していれば、簡単に解決する事がある」という大きな学びを得た思い出です。
この記事を読んだ方に多少でも役に立つ知識となれれば幸いです。
ここまで読んで頂きありがとうございました。
参考資料
man ”more” ページ (more バージョン 5.19時情報)
-man-db/focal,now 2.9.1-1 amd64
moreコマンド の初期の歴史 ※開発者の方のHP
https://danhalbert.org/more.html
Less ※開発者の方のHP
https://www.greenwoodsoftware.com/less/index.html
more(1) - Arch manual pages
https://man.archlinux.org/man/more.1.en