未経験からのフルスタックエンジニア

スキルをつけよう!未経験からフリーランスエンジニアへの成長記録

Linux学習履歴(3)~マニュアル参照・ファイル検索~

以下の記事の続きです。

atora1992.hatenablog.com

Linuxコマンドライン入門』が日ごとに6日間分別れているので、今回は4日目の中間地点までの内容についてです。

コマンドの備忘録的になってしまうと思いますので、悪しからず。

4日目

マニュアルを参照する

コマンドのマニュアルを見たい場合には

$ man [コマンド名]

デフォルトは英語です。自分は日本語化していませんが、日本語化も可能とのことです。

qiita.com

オンラインマニュアルはページャ(lessとか)を用いているので、そのコマンドが使えます。

  • Space: 次のページへ
  • b: 前のページへ
  • q: 終了する

具体例

$ man grep

GREP(1)                   BSD General Commands Manual                  GREP(1)

NAME
     grep, egrep, fgrep, zgrep, zegrep, zfgrep -- file pattern searcher

SYNOPSIS
     grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
          [-e pattern] [-f file] [--binary-files=value] [--color[=when]]
          [--colour[=when]] [--context[=num]] [--label] [--line-buffered]
          [--null] [pattern] [file ...]

DESCRIPTION
     The grep utility searches any given input files, selecting lines that
     match one or more patterns.  By default, a pattern matches an input line
     if the regular expression (RE) in the pattern matches the input line
     without its trailing newline.  An empty expression matches every line.
     Each input line that matches at least one of the patterns is written to
     the standard output.

.....

[file ...]は複数ファイル選択が可能なことを示しています。

GREP(1)は、grepコマンドがセクション1に属していることを示しています。
セクションは8つあり、若いセクションの内容が表示されます。

セクション 説明
1 user commands
2 system calls
3 library functions
4 special files (devices)
5 file formats and filesystems
6 games
7 overview and miscellany section
8 administration and privileged commands

他のセクションに属しているかどうかは、マニュアル中のSEE ALSOで確認できます。
もしくは、以下のコマンドでも確認できます。

$ man -wa [コマンド名]

セクション指定で検索したい場合は以下のように、セクション番号を指定します。

$ man [セクション番号] [コマンド名]

キーワードで検索することもできます。(キーワードには正規表現が使えます)

$ apropos [キーワード]
$ apropos [キーワード] | grep "(1)"  #セクション1のみを検索する

コマンドに関する簡単な説明を表示するには

$ whatis [コマンド名]

コマンドの保存先を調べるには

$ type [コマンド名]  #エイリアスというコマンドの別名が定義されている場合、その内容を表示する
$ which [コマンド名]  #エイリアスが設定されていても、保存先のパスを表示する

typeで調べた結果、例えば"cd is a shell builtin”と表示される場合があります。これは、cdがシェルの組み込みコマンドであることを示しています。実行可能形式のファイルとシェルの組み込みコマンドの両方がある場合には、以下のコマンドで確認できます。

$ type -a [コマンド名]

ファイルを検索する

$ find [検索の起点となるディレクトリ] -name [名前]  #名前で検索
※ファイルだけだなくディレクトリもヒットする
$ find [検索の起点となるディレクトリ] -mtime [日数]  #更新日時で検索する
$ find [検索の起点となるディレクトリ] -mtime +[日数]  #日数より前
$ find [検索の起点となるディレクトリ] -mtime -[日数]  #日数よりあとから現在まで
$ find [検索の起点となるディレクトリ] -atime [日数]  #アクセスした時間で検索する 

検索となる起点のディレクトリから、サブディレクトリまでが検索範囲となります。起点となるディレクトリを指定しない場合は、カレントディレクトリが起点となります。

ワイルドカードによる検索も可能です。

$ find -name "*.js*"  #カレントディレクトリ以下で、拡張子が"js"のファイルを検索する
※ワイルドカードを使用する場合は、ダブルクォーテーション(シングルクォーテーション)で括る

ファイルかディレクトリかを指定して検索したい場合にはtypeオプションを使用します。

$ find [検索の起点となるディレクトリ]  -type d  #ディレクトリ検索
$ find [検索の起点となるディレクトリ]  -type f  #通常のファイル検索

上記の検索条件を複数指定(AND検索)もできます。その場合は、オプションをスペースで分割してタイプしてください。

OR検索したい場合には、oオプションを使用します。

$ find -name "*.js" -o -name "*.haml"  #拡張子が"js"か"haml"のファイルを検索する

否定条件を使いたい場合には、条件の前に"\!"をつけます。

$ type Pictures -type d \! -empty #Picturesディレクトリ以下の、空でないディレクトリを検索する

今までは、単に検索するだけでしたが、検索実行結果をコマンドに渡すこともできます(コマンド置換)。実行結果を取り出すコマンドをバッククォーテーションで括ります。もしくは、$(コマンド)とします。

$ ls -l `which cd`
-rwxr-xr-x  15 root  wheel  190  8 18  2018 /usr/bin/cd

$ ls -l $(which cd)
-rwxr-xr-x  15 root  wheel  190  8 18  2018 /usr/bin/cd

ただし、ファイル名にスペースなどがあるとうまくいかない場合があります。 そこで、別のコマンドを実行できるexecオプション(もしくはokオプション)が使えます。

$ find [検索の起点となるディレクトリ] -name [名前] -exec [実行したいコマンド] {} \;
※{}が検索結果のファイルに置きかわる
※{}と\;の間にスペースが必須

$ find [検索の起点となるディレクトリ] -name [名前] -ok [実行したいコマンド] {} \;  #実行したいコマンドを実行する前に実行するかどうか(y or n)を確認する

$ find . -name "*.js" -print -exec ls -l {} \;  #カレントディレクトリ以下の、拡張子が"js"のファイルの詳細を表示する("print"オプションで検索結果のファイルのパスを表示できます)

execオプションではなくて、xargsコマンドを使用しても同様のことが可能です。

$ find . -name "*.js" -print0 | xargs -0 grep -n "alert"  #カレントディレクトリ以下の、拡張子が"js"のファイルのうち、"alert"を含む行を行番号を付与して表示する
※-print0と-0"0"は、ファイル名にスペースや特殊文字がある場合に設定する

次の記事へ

atora1992.hatenablog.com