Mac ターミナルの基本的な使い方・操作方法(1)

Mac のターミナルを使う方法の覚書です。ターミナルの設定や基本的なコマンド、リダイレクトやパイプの使い方など。

作成日:2019年08月26日

関連ページ

Mac のターミナル

Mac のターミナルは「アプリケーション」→「ユーティリティ」にあります。

Finder 「アプリケーション」→「ユーティリティ」→「ターミナル」のスクリーンショット

ターミナルのアイコンをダブルクリックするとターミナルが起動します。

Finder からターミナルを開く

Finder でフォルダを右クリックして、メニューから「サービス」→「フォルダに新規ターミナル」を選択すると、そのフォルダをカレントディレクトリとしてターミナルを開くことができます。

Finder からターミナルを開く際のスクリーンショット

「フォルダに新規ターミナルタブ」を選択すると、既存のターミナルのウィンドウに新たなタブが開かれます。

もし、サービスに「フォルダに新規ターミナル」の項目が表示されない場合は、「システム環境設定」→「キーボード」→「ショートカット」→「サービス」で「フォルダに新規ターミナル」と「フォルダに新規ターミナルタブ」にチェックを入れます。

システム環境設定のキーボードの設定のスクリーンショット

新規ウィンドウやタブを開く

ターミナルを開いている状態で、新規にターミナルのウィンドウを開くには command + n を押します。

新規タブを開くには command + t を押します。

スーパーユーザと一般ユーザ

一般的な UNIX 系のシステムではユーザは「スーパーユーザ」と「一般ユーザ」に分けられ、「スーパーユーザ」はあらゆる操作が可能で、ユーザ名は root に決められています。

macOS では、デフォルトでは root でログインしたり、一時的に root に移行して操作を行ったりすることができないようになっています。

スーパーユーザの権限が必要な操作を行うには、管理者として登録されているユーザが sudo というコマンドを使用して一時的にスーパーユーザの権限を取得してコマンドを実行します。

Rootless モード

macOS ではデフォルトではスーパーユーザになれませんが、sudo コマンドを使えばシステムに対してあらゆる操作を行えるのでシステムに対して重大な影響を与えてしまう危険性があります。

そのため、OS X El Capitan からはスーパーユーザであってもシステムの重要なディレクトリ内の書き換えができないようになっています。

この仕組を System Integrity Protection (SIP) と呼び、root ユーザーが存在しないという意味で「Rootless モード」とも呼ばれています。

例えば、以下のディレクトリ以下は sudo コマンドを使っても変更することはできないようになっています(表示は可能)。

  • /System
  • /bin
  • /sbin
  • /usr

Rootless モードを解除するには、リカバリーモードで起動して csrutil コマンドを使います。

ターミナルのオプション

ターミナルのサイズや背景色、文字色などはターミナルメニューの環境設定で変更することができます。

ターミナルメニューと環境設定画面

ターミナルでは背景色やフォント、ウィンドウサイズ、エンコーディングなどの設定は「プロファイル」として管理されています。

背景色、文字色などはプロファイルタブで設定することができます。好みのプロファイルを選択して「デフォルト」をクリックすると、そのプロファイルがデフォルトに設定されます。

「起動」と表示されているのは「一般タブ」で「起動時に開く:」に選択されているプロファイルです(デフォルトと異なるものが選択されている場合)。

「+」をクリックして独自のプロファイルを作成することもできます。

歯車のアイコンをクリックすると、プロファイルの複製などのオプションが表示されます。

それぞれのプロファイルは、「テキスト」「ウィンドウ」「タブ」「シェル」「キーボード」「詳細」のパネルで構成されています。

環境設定画面(プロファイルタブ)

ターミナルのサイズは「ウィンドウ」を選択して、「ウィンドウサイズ」に行数と列数を指定して変更することができます。

環境設定画面(プロファイルタブのウィンドウオプション)

また、「ウィンドウ」でターミナルの上部に表示されるタイトルを変更することができます。

デフォルトでは作業ディレクトリ名と動作中のプロセス名(-bash)及び大きさ(80x24)が表示されますが、「タイトル」以下のチェックボックスで表示をカスタマイズできます。

ターミナルの上部に表示されるタイトル

「詳細」を選択すると言語環境などを設定できます。

「起動時にロケール環境変数を設定」にチェックが入っていれば、日本語環境の場合、date コマンドなどで表示される日付等が日本語の書式で表示されます。

環境設定画面(プロファイルタブの詳細オプション)

一時的にプロファイルを変更

ターミナルのメニュー「シェル」→「インスペクタを表示」( command + i )で表示されるインスペクタの「プロファイル」タブを選択して、いずれかのプロファイルをクリックすると現在のターミナルに反映されます。

また、現在選択されているプロファイルの設定の概要は「情報」タブで確認することができます。

ターミナルのインスペクタ

Apple ターミナルユーザガイド

プロンプトの変更

プロンプトの書式はデフォルトでは「ホスト名:現在のディレクトリ名 ユーザ名$」になっています。

必要に応じてこの書式を変更することができます。

ターミナルのスクリーンショット

プロンプトの書式は、シェル変数(環境変数) PS1(The primary prompt string)で定義されています。 以下は現在のユーザーの PS1 の内容を出力する例です。

echo $PS1  
\h:\W \u\$

\h や \W は以下のような意味があります。

書式で使えるエスケープ文字の例(一部)
エスケープ文字 意味
\H ホスト名
\h ホスト名(最初の.まで)
\W 現在のディレクトリ名
\w 現在のディレクトリ(フルパス)
\u 現在のユーザー名
\$ $ は変数を表すので、ダブルクォートで $ を表示させたい場合は \$ のようにエスケープします。
\T 時刻 HH:MM:SS 形式(12時間)
\t 時刻 HH:MM:SS 形式(24時間)

一時的にプロンプトを変更するには、以下のように PS1 に書式を指定します(必要に応じて適宜スペースを入れます)。

PS1="\W \$ "  #現在のディレクトリ名 $ 

上記の場合、ターミナルを再起動すると設定が戻ってしまうので、設定を保存するには ~/.bashrc などに設定を記述します。

但し、Mac の場合、初期状態ではユーザー毎に設定できる ~/.bashrc や~/.bash_profile は作成されていないようです(/etc/bashrc や /etc/profile はシステム全体の設定用なので使いません)。

~/.bashrc ログインシェル以外でシェルを起動したときに読み込まれるファイル。シェル起動時に実行する設定(プロンプトやエイリアスの設定など)を記述。
~/.bash_profile ログイン時に読み込まれる(ログインシェルだけに実行される)ファイル。環境変数などログイン時に実行する設定を記述。

「~」は現在ログインしているユーザーのホームディレクトリを表します。

ドット(.)が最初に付いたファイルは隠しファイルになるので、Shift + Command + . を押して表示させることができます。

ls コマンドの場合は -a オプションを付けます。

Finder でのユーザーディレクトリのスクリーンショット

~/.bashrc と ~/.bash_profile の作成

GUI のエディタでもこれらのファイルは作成可能ですが、以下はターミナルと vim を使う場合の例です。

touch コマンドで空の ~/.bashrc と ~/.bash_profile を作成して ls コマンドで確認します。

touch ~/.bashrc    return 
touch ~/.bash_profile    return 

ls -a    return 
.					Applications (Parallels)
..					Creative Cloud Files
.CFUserTextEncoding			Desktop
.DS_Store				Documents
.Trash					Downloads
.bash_history				Library
.bash_profile				Movies
.bash_sessions				Music
.bashrc					Parallels
.cups					Pictures
.mysql_history				Public
.viminfo				iCloud Drive(アーカイブ)
Applications

Finder でのユーザーディレクトリのスクリーンショット(~/.bashrc と ~/.bash_profile が追加されている)

.bash_profile の編集

ターミナルに以下を入力して .bash_profile を vim で編集し、ログイン時にも ~/.bashrc が読み込まれるようにします。

vim ~/.bash_profile    return 

i を押して挿入モードにして、以下を記述して esc を押して挿入モードを解除します。

続いて :wq と入力して内容を保存し vim を終了します。

if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

.bashrc の編集(プロンプトの書式を設定)

次にターミナルに以下を入力して .bashrc を vim で編集し、プロンプトの書式を設定します。

vim ~/.bashrc    return 

前述と同様、i で挿入モードにして、以下を記述して esc を押して挿入モードを解除します。

続いて :wq と入力して内容を保存し vim を終了します。

PS1="\W \$ "

上記の例の場合、プロンプトは「現在のディレクトリ名 $」のようになります。

.bashrc と.bash_profile を反映

.bashrc と.bash_profile の変更を反映するために、ターミナルで以下を実行します。

source ~/.bashrc    return 
source ~/.bash_profile    return 

以下はプロンプトの書式変更後のターミナルの例です。

プロンプトの書式を変更後のターミナルのスクリーンショット(~/.bashrc と ~/.bash_profile が追加されている)

コマンドの実行

コマンドを実行するには、プロンプトの後にコマンドを入力して return を押します。

現在の日時を表示するコマンド date と入力して return を押すと現在の日時が表示されて、再びプロンプトが表示されます。

cal と入力して return を押すと今月のカレンダーが表示されて、再びプロンプトが表示されます。

コマンドを実行後のターミナルのスクリーンショット(~/.bashrc と ~/.bash_profile が追加されている)

ターミナルからのログアウト

ターミナルからログアウトするには、exit コマンドを実行するか control + d を押します。

ログアウトせずに、ターミナルのウィドウを閉じたり、command + q でターミナル自体を終了しても自動的にログアウトされるようになっています。

中断

コマンドを中断するには control + c で中断することができます。

引数の指定

以下は引数を指定してコマンドを実行する場合の書式です。

コマンドと引数、引数間には区切り文字としてスペースを入れます。スペースはいくつ入っても大丈夫ですが、スペース以外は区切り文字として使えません。

コマンド 引数 引数 ...

受け取る引数の数やどのような引数を受け取るかは、コマンドにより異なります。

※書式に記述されている [ ] は省略可能な引数やオプションを示しています。

例えば cal コマンドの書式は以下のようになっています(オプションは省略しています)。

cal [[month] year]

引数 month と year は省略可能で、month と year の両方、または year のみ指定することもできます。

以下は2020年8月のカレンダーを表示する例です。

cal 8 2020 return 
      8月 2020         
日 月 火 水 木 金 土  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28 29  
30 31      

オプション

引数の中で - に続いて1文字のアルファベットで指定するオプションは、コマンドの動作を指定するものです。

例えばディレクトリの一覧を表示する ls コマンドに -a オプションを指定すると、ドット(.)から始まる隠しディレクトリやファイルも表示します。

以下はルートディレクトリ(/)の配下をすべて表示する例です。

ls -a / return 
.					Quarantine
..					System
.DS_Store				Users
.DocumentRevisions-V100			Volumes
.PKInstallSandboxManager		bin
.PKInstallSandboxManager-SystemSoftware	cores
.Spotlight-V100				dev
.Trashes				etc
.com_kaspersky_ids_drop			home
.com_kaspersky_iswift_journal		installer.failurerequests
.file					net
.fseventsd				private
.vol					sbin
Applications				tmp
Library					usr
Network					var

コマンドによってはオプションを複数同時に指定できるものもあります。

ls コマンドに -a オプションと -l オプション(1行ずつ表示)を同時に指定するには、ls -al または ls -a -l とすることができます。

ls -al / return   #または ls -a -l  /
total 2181
drwxr-xr-x  32 root  wheel    1024  8  7 10:36 .
drwxr-xr-x  32 root  wheel    1024  8  7 10:36 ..
-rw-rw-r--   1 root  admin   10244  8  6 14:46 .DS_Store
d--x--x--x   9 root  wheel     288  8 10 07:12 .DocumentRevisions-V100
drwxr-xr-x   2 root  wheel      64  5  4 18:26 .PKInstallSandboxManager
drwx------   2 root  admin      64  8  6 17:37 .PKInstallSandboxManager-SystemSoftware
drwx------   5 root  wheel     160  5  4 18:26 .Spotlight-V100
d-wx-wx-wt   3 root  wheel      96  7 25 07:16 .Trashes
-rw-r--r--   1 root  wheel  533534  8 10 07:12 .com_kaspersky_ids_drop
-rw-------   1 root  wheel  560040  8 10 14:57 .com_kaspersky_iswift_journal
----------   1 root  admin       0  2 26 13:50 .file
drwx------  17 root  wheel     544  8 10 11:40 .fseventsd
drwxr-xr-x   2 root  wheel      64  2 26 13:49 .vol
drwxrwxr-x+ 66 root  admin    2112  8 10 07:18 Applications
drwxr-xr-x+ 67 root  wheel    2144  8  9 14:21 Library
drwxr-xr-x   2 root  wheel      64  2 26 13:49 Network
drwxrwx---   2 root  499        64  7 31 13:15 Quarantine
drwxr-xr-x@  5 root  wheel     160  5  4 14:21 System
drwxr-xr-x   5 root  admin     160  8  7 11:11 Users
drwxr-xr-x+  5 root  wheel     160  8 10 14:17 Volumes
drwxr-xr-x@ 37 root  wheel    1184  8  6 17:37 bin
....

オプションには、値を指定するものもあります。

例えば、cal コマンドは -m month の形式で今年の指定した月のカレンダーを表示することができます。

cal -m 12 return 
      12月 2019        
日 月 火 水 木 金 土  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30 31 

コマンドラインに複数行を入力

コマンドを複数行で入力することもできます。

例えば、cat コマンドは複数のフィルを引数に取ることができます。2つのファイル .bashrc と .bash_profile を引数に指定して表示するには1行で以下のように記述することができます。

cat .bashrc .bash_profile  return 
PS1="\W \$ "
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

引数を改行で区切って入力するには、改行したい位置で \ を入力し return を押します。

プロンプトがセカンダリプロンプト「>」に変わるので、続いて残りのコマンドを入力し return を押して実行します。

cat .bashrc \ return
> .bash_profile  return
PS1="\W \$ "
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

特殊文字やクォート

特殊文字の指定

スペースや & などの記号は特別な意味を持つ特殊文字(メタキャラクタ)になっていますが、これらの文字はファイル名やディレクトリ名として使用することができます。

これらの文字が含まれるファイルやディレクトリを指定する際は、クォートで囲むかバックスラッシュを使ってエスケープする必要があります。

例えば「Creative Cloud Files」というスペースを含む名前のディレクトリがある場合、ls コマンドや cd コマンドで以下のようにファイル名を指定するとうまくいきません。

ls Creative Cloud Files  return
ls: Cloud: No such file or directory
ls: Creative: No such file or directory
ls: Files: No such file or directory
//3つの引数(ファイルまたはディレクトリ)を指定されたと解釈されてしまう

~ $ cd Creative Cloud Files  return
-bash: cd: Creative: No such file or directory
//Creative というディレクトリを指定されたと解釈されてしまう

以下のように名前全体をクォート(引用符 ' または ")で囲むかスペースの前にバックスラッシュ(\)を入れてエスケープします。

ls 'Creative Cloud Files'  //または ls "Creative Cloud Files"
ls Creative\ Cloud\ Files

cd 'Creative Cloud Files'  //または cd "Creative Cloud Files"
cd Creative\ Cloud\ Files

クォート(引用符)

クォート(引用符 ' または ")も特殊文字(メタキャラクタ)なので、記述する場所によってはエスケープなどが必要です。

例えば、echo コマンドの引数に「one's」を指定する場合、エスケープしないと以下のようになってしまいます。

echo one's return
> 
//シングルクォートの後にまだ文字列が続くものと解釈され、セカンダリプロンプトが表示される

上記の場合、システムは文字列を閉じるための次のシングルクォートを期待しているので、シングルクォートを入力するか、control + c で中断します。

echo コマンドで「one's」を出力させるには、シングルクォートをエスケープするか、全体をダブルクォートで囲みます。

echo one\'s
//または
echo "one's"

ダブルクォートは変数を展開しますが、シングルクォートは変数を展開しないという違いがあります。

例えば、$PS1 は環境変数でプロンプトの書式を格納しています。

echo コマンドを使ってこの変数を出力する場合、以下のような違いがあります。

echo $PS1  return
\W $  #変数が展開されて出力される

echo '$PS1'  return
$PS1  //文字列として出力される

echo "$PS1"  return
\W $   #変数が展開されて出力される

echo \$PS1  return
$PS1  //バックスラッシュで $ がエスケープされ文字列として出力される

man マニュアル

マニュアル(英語)を表示するには、man コマンドを使います。個々のコマンドの引数やオプションを確認するのに便利です。以下が書式です。

man [オプション] コマンド名

以下は cp コマンドのマニュアルを表示する例です。man コマンドを終了するには q を押します。

man cp  return //以下が表示されます。終了するには q を押します。
          
CP(1)                     BSD General Commands Manual                    CP(1)

NAME  //コマンド名と概要
     cp -- copy files

SYNOPSIS  //書式
     cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
     cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ...
        target_directory

DESCRIPTION  //コマンドの説明とオプションの解説
     In the first synopsis form, the cp utility copies the contents of the
     source_file to the target_file.  In the second synopsis form, the con-
     tents of each named source_file is copied to the destination
     target_directory.  The names of the files themselves are not changed.  If
     cp detects an attempt to copy a file to itself, the copy will fail.

     The following options are available:

     -a    Same as -pPR options. Preserves structure and attributes of files
           but not directory structure.

     -f    If the destination file cannot be opened, remove it and create a
           new file, without prompting for confirmation regardless of its per-
           missions.  (The -f option overrides any previous -n option.)

           The target file is not unlinked before the copy.  Thus, any exist-
           ing access rights will be retained.


・・・中略・・・


COMPATIBILITY  //互換性情報
     Historic versions of the cp utility had a -r option.  This implementation
     supports that option; however, its use is strongly discouraged, as it
     does not correctly copy special files, symbolic links, or fifos.

     The -v and -n options are non-standard and their use in scripts is not
     recommended.

LEGACY DESCRIPTION
     In legacy mode, -f will override -i.  Also, under the -f option, the tar-
     get file is always unlinked before the copy.  Thus, new access rights
     will always be set.

     In -R mode, copying will terminate if an error is encountered.

     For more information about legacy mode, see compat(5).

SEE ALSO  //関連コマンド
     mv(1), rcp(1), umask(2), fts(3), compat(5), symlink(7)

STANDARDS
     The cp command is expected to be IEEE Std 1003.2 (``POSIX.2'') compati-
     ble.

HISTORY
     A cp command appeared in Version 1 AT&T UNIX.

BSD                            February 23, 2005                           BSD
(END)

マニュアルの表示

man コマンドは内部では less コマンドを使用してマニュアルを表示していて、以下のキー操作が可能です。

キー操作(一部抜粋)
キー 操作
return 一行分スクロール
e 一行分スクロール
y 一行分戻る
一行分スクロール
一行分戻る
space 1画面分スクロール
b 1画面分戻る
q 終了

マウスなどでスクロールすることもできます。

また、/ に続いて検索したい文字列を入力し、retun を押すと、マッチする箇所がハイライト表示されます。

代替スクリーン

man コマンドはテキストの表示に代替スクリーンを利用しています。以下は代替スクリーンの表示・非表示のショートカットキーです。

  • 代替スクリーンを表示する: shift + command + page Down
  • 代替スクリーンを非表示にする: shift + command + page Up

例えば、man コマンドを実行してマニュアルを表示中に shift + command + page Up を押せば、コマンドラインの表示を確認することができます。

また、man コマンドを終了後、shift + command + page Downを押せば、直前に開いていたマニュアルを確認することができます。

whatis コマンド

whatis コマンドはコマンドの簡単な説明を表示します。man -f に相当します。以下が書式です。

whatis コマンド名

コマンドの概要を知ることができます。

whatis cd  #または man -f cd
builtin(1), !(1), %(1), .(1), :(1), @(1), {(1), }(1), alias(1), alloc(1), bg(1), bind(1), ..中略.. - shell built-in commands
cd(ntcl)                 - Change working directory
drutil(1)                - interact with CD/DVD burners
mount_cddafs(8)          - mount an Audio CD

apropos コマンド

apropos コマンドは、キーワードを指定して関連するコマンドを検索するためのコマンドです。man -k に相当します。以下が書式です。

apropos キーワード

コマンド名の一部や概要文からも検索することができ、実行するとキーワードに関連するコマンドと簡単な説明が表示されます。

以下はキーワード http で実行した結果の例です。

apropos http  #または man -k http
ab(1)                    - Apache HTTP server benchmarking tool
apachectl(8)             - Apache HTTP Server Control Interface
autoproxy(n)             - Automatic HTTP proxy usage and authentication
http(ntcl)               - Client-side implementation of the HTTP/1.1 protocol
httpd(8)                 - Apache Hypertext Transfer Protocol Server
httpd-wrapper(8)         - Wrapper script for httpd web server
nsurlstoraged(8)         - The HTTP network storage daemon

tab の入力補完

コマンド名やファイル名の入力を tab を使って補完することができます。

コマンドの補完

コマンド名の途中まで入力して tab を押すと、補完候補が1つだけの場合はその補完候補のコマンドが表示(補完)されます。

補完候補が複数ある場合は tab を押しても通知音が鳴るだけで、補完もされず、候補も表示されません。

補完候補が複数ある場合は tab を2回押すと、候補の一覧が表示されます。

例えば、cl と入力して tab を押すと候補が複数あるので通知音が鳴り、再度 tab を押すと候補が表示されます。

候補を確認して次の文字を入力し、候補が1つになればそのコマンドが補完されます。

cl   tab を2回押す
clang    clang++  clear    
cle    tab を押す
clear 

上記の例では cle と入力して tab を押すと clear が補完されます。

ファイル名の補完

ファイル名もコマンド名と同じように tab を使って入力を補完することができます。

ls /S   tab を押すと以下に補完されます
ls /System/
ls /System/L   tab を押すと以下に補完されます
ls /System/Library/
ls /System/Library/A   tab を押すと通知音が鳴るので再度 tab を押し候補を表示
AWD/                     Address Book Plug-Ins/   Assistant/
Accessibility/           AssetCache/              Audio/
AccessibilityBundles/    AssetTypeDescriptors/    Automator/
AccessoryUpdaterBundles/ Assets/                  
Accounts/                AssetsV2/ 
ls /System/Library/Aud   tab を押すと以下に補完されます
ls /System/Library/Audio/

コマンド履歴

実行したコマンドはコマンド履歴として保存されます。

または control + p を押すごとに過去に実行したコマンドが呼び出されて表示されます。

または control + n を押すと最近実行したコマンドの方に戻ります。

history コマンド

history コマンドを使うと過去に実行したコマンドの一覧を表示することができます。

以下が書式です。

history [表示するコマンド数]

引数を指定せずに実行すると最大500個のコマンドが表示されます。

以下は実行例です。

history   return 
  1  ls
  2  nano
  3  vi
  4  pwd
 ・・・中略・・・
 84  touch ~/.bashrc
 85  touch ~/.bash_profile
 86  ls -a
 87  vi ~/.bash_profile
 88  vi ~/.bashrc
 89  source ~/.bash_profile
 90  source ~/.bash_profile
 91  ls -a    
 ・・・中略・・・
 500 history
   

履歴の左側の番号はこの履歴の中でコマンドを識別するための番号です。

以下のように番号を指定してコマンドを実行することができます。

!コマンドを識別するための番号 return

!91 return
          
#上記の例の場合91番の ls -a が実行される

以下のように !! と入力して return を押すと直前に実行したコマンドを再実行することができます。

 !! return

インクリメンタルサーチ

コマンド履歴の中から特定のコマンドを検索するには、control + r を押します。

インクリメンタルサーチというモードになり、プロンプトのところに以下のように表示されます。

(reverse-i-search)`': 

続いて検索するコマンド名を入力すると、新しい方から古い方に向かって入力したコマンドが検索されて表示されます。

control + r を更に押すと、同じ文字列を含む次に古いコマンドが検索されます。

引数などを続けて入力することで、コマンドを絞り込むことができます。

(reverse-i-search)`cat ~': cat ~/.bash_profile  #cat ~ と入力した例

esc を押すとその時点の検索されたコマンドがプロンプトの後に表示された状態になるので、実行することができます。

マーク機能

過去に実行したコマンドの結果などを確認するには、マークやブックマーク機能を使うと便利です。

設定されているマークやブックマークの位置に移動することができます。

  • 角括弧([ ]):マーク
  • 縦線(|):ブックマーク

ターミナルに表示されているマークやブックマークの印のスクリーンショット

ターミナルのメニューの「編集」→「マーク」→「プロンプトの行を自動的にマーク」にチェックが入っていれば、各プロンプトの行が自動的にマークされます。

または、マークしたい行を選択してショートカットメニューから「マーク」を選択( command + u )することもできます。

マークを削除するには、マークを削除したい行を選択してショートカットメニューから「マークを解除」を選択( shift + command + u )します。

ブックマークは、マークに名前を設定できるようにしたようなもので見た目でも動作としても重みのあるマークです。

ブックマークを挿入するには、ターミナルのメニューの「編集」→「ブックマーク」→「ブックマークを挿入」を選択( shift + command + m )します。

マークやブックマークの位置に移動するには、ターミナルのメニューの「編集」→「移動」から選択したりショートカットキーが使えます。

  • 前のマークへジャンプ ( command + ↑
  • 次にマークへジャンプ ( command + ↓
  • 前のブックマークへジャンプ ( option + command + ↑
  • 次にブックマークへジャンプ ( option + command + ↓

Mac のターミナルでマークとブックマークを使う

ディレクトリを表す記号 ~ や ..

ホームディレクトリや1つ上のディレクトリなどは簡単に指定できる以下のような記号が用意されています。

記号 意味
~(チルダ) ホームディレクトリ
~-(チルダとハイフン) 直前にいたディレクトリ
.(ドット) カレントディレクトリ
..(ドット2つ) 1つ上のディレクトリ

~(チルダ)は、現在ログインしているユーザのホームディレクトリを表します。

例えば、任意のあるディレクトリで作業をしていて、ホームディレクトリ直下のデスクトップの一覧を表示するには ls コマンドを使って以下のようにします。

ls ~/Desktop  return 

直前にいたディレクトリに戻るには、cd コマンドに ~-(チルダとハイフン)を指定します。

 cd ~-  return

1つ上のディレクトリに移動するには、cd コマンドに ..(ドット2つ)を指定します。

cd ..  return #1つ上のディレクトリへ
        
cd ../..   return #2つ上のディレクトリへ 

以下は cp コマンドを使って、デスクトップの sample.txt というファイルをカレントディレクトリ(.)にコピーする例です。

cp ~/Desktop/sample.txt .  return

ワイルドカード

ワイルドカードは任意の文字や文字列にマッチする特別な記号(特殊文字)です。

bash ワイルドカードの例
ワイルドカード 意味
* 任意の文字列とマッチ
? 任意の1文字とマッチ
[文字] 指定した文字(複数や範囲を指定可能)の中の1文字とマッチ

*(アスタリスク)は0文字以上の文字列とマッチします。

例えば、カレントディレクトリで拡張子が .html のファイルの一覧を表示させるには ls コマンドとワイルドカード(*)を使って以下のようにします。

ls *.html  return
top.html		index.html
errmsg.html		404.html

カレントディレクトリ(~)下のデスクトップで拡張子が .txt のファイルを一覧表示するのに以下のようにすると、カレントディレクトリ(~)が展開されてフルパスで表示されます。

ls ~/Desktop/*.txt  return
/Users/foo/Desktop/sample.txt	/Users/foo/Desktop/tag_samples.txt

?(クエスチョンマーク)は任意の1文字とマッチします。

以下は任意のファイル名で3文字の拡張子のファイルを表示する例です。

ls *.???  return
ads.txt	   index.php	sitemap.xml
favicon.ico	robots.txt

[abc] とすると、「a」か「b」か「c」にマッチします。

以下はカレントディレクトリでファイルの先頭が「a」か「b」か「c」のいずれかにマッチして、拡張子が .php の一覧を表示する例です。

ls [abc]*.php  return
admin-bar.php
atomlib.php
blocks.php
bookmark.php
cache.php
canonical.php
capabilities.php
...

[文字-文字]のようにハイフンを使って文字の範囲を指定することができます。

例えば数値なら[0-9]のように指定することができます。以下はファイル名が数値から始まり拡張子が .JPG の一覧を表示する例です。

ls [0-9]*.JPG  return
001.JPG	003.JPG	005.JPG	007.JPG	009.JPG	...

アルファベットは[a-zA-Z] 、小文字のみのアルファベットは [a-z] のように指定することができます。

また、角カッコの先頭に否定を意味する「^」を付けると指定した文字以外にマッチします。

例えば、以下のように指定すると、アルファベットの小文字以外で始まる HTML ファイルにマッチします。

ls [^a-z]*.html  return
00_template.html	404.html

ブレース展開

bash の機能の一つに複数の文字列に任意の文字列を加えたり指定した文字や数字を展開できるブレース展開というワイルドカードに似た機能があります。

波括弧 { } の中に文字列をカンマで区切って指定すると、シェルがそれらの文字列を展開します。また、.. と記述すると連番や連続したアルファベットを展開します。

echo x{a,b,c}  return
xa xb xc

echo {a,b,c}x  return
ax bx cx

echo x{a,b,c}y  return
xay xby xcy

echo {abc,123,xyg}.jpg  return
abc.jpg 123.jpg xyg.jpg

echo {a..g}  return
a b c d e f g

echo {1..9}  return
1 2 3 4 5 6 7 8 9

以下はカレントディレクトリで拡張子が .jpg .png .gif のいずれかにマッチするファイルを一覧表示する例です。

※カンマの後にスペースを入れると引数の区切りと解釈されてしまいます(スペースを入れません)。

ls *.{jpg,png,gif}  return
404.jpg				dummy.gif
extensions.png			photo_01.jpg
header.jpg			...

キーボードショートカット

ターミナルのキーボードショートカットは、以下の Apple のページに掲載されています。

Mac のターミナルのキーボードショートカット

ディレクトリ

Finder から見たディレクトリ構造と実際のディレクトリ構造では多少異なっています。

以下は Finder から見たディレクトリ構造です。

Finder でみたファイル構造

以下はターミナルでルートディレクトリ(/)に移動して ls コマンドでディレクトリの一覧を表示した例です。

ターミナルでルートディレクトリに移動して ls コマンドを実行した際のスクリーンショット

以下は shift + command + . を押して隠しファイルを表示した場合の Finder から見たディレクトリ構造です。

Finder でみた隠しファいるも含むファイル構造

以下はルートディレクトリで -a オプションを指定した ls コマンドでディレクトリの一覧を表示した例です。

ターミナルでルートディレクトリに移動して ls -a  コマンドを実行した際のスクリーンショット

macOS や UNIX などでは、ルートディレクトリ「/」を頂点とした階層構造になっています。

UNIX 系システムの主なディレクトリ

ディレクトリ 概要(配置されるファイル)
/bin、/usr/bin 基本コマンド
/sbin、/usr/sbin システム管理用コマンドなど
/dev デバイスファイル
/etc 設定ファイル。/private/etc のシンボリックリンク。
/tmp 一時的なファイル。ここに配置されたファイルは次回のシステム起動時には削除される。/private/tmp のシンボリックリンク。
/var 変更されるデータ。キャッシュデータ、ログファイルなど変更されるファイル。/private/var のシンボリックリンク。
/usr/lib ライブラリファイル
/usr/local ユーザーがインストールしたソフトウェアのファイル
/usr/share システムに依存しない共有データファイルやドキュメント、オンライマニュアルなど。

macOS 独自の主なディレクトリ

ディレクトリ 概要(配置されるファイル)
/Users ユーザーのホームディレクトリ。Finder では「ユーザ」。
/System/Library macOS 独自の拡張機能などのライブラリファイル。Finder では「システム」→「ライブラリ」
/Library アプリケーション独自の拡張機能などのライブラリファイル。Finder では「ライブラリ」
/Applications アプリケーションのファイル。Finder では「アプリケーション」

ディレクトリ操作の基本コマンド

ls 一覧表示

ls コマンドは(指定した)ディレクトリの一覧やファイルを表示するコマンドです。

ls [オプション] [パス]

[パス]にはディレクトリやファイルのパスを指定します。

引数無しで実行すると、カレントディレクトリの一覧が表示されます。

通常ターミナルを起動した場合、カレントディレクトリはそのユーザのホームディレクトリになっているので、その状態で ls コマンドを実行するとホームディレクトリのディレクトリやファイルの一覧が表示されます。

以下はホームディレクトリで実行した例です(表示されるディレクトリやファイルは環境やインストールしているソフトウェアにより異なります)。

ls return
Applications				Movies
Applications (Parallels)		Music
Creative Cloud Files			Parallels
Desktop					Pictures
Documents				Public
Downloads				iCloud Drive(アーカイブ)
Library

以下はユーザ foo のデスクトップディレクトリの一覧を表示する例です。

ls /Users/foo/Desktop return
$RECYCLE.BIN	Working		htdocs
Windows 10	desktop.ini	tag_samples.txt

現在ユーザ foo のホームディレクトリにいる場合は、相対パスで指定すると簡単です。

ls Desktop return
$RECYCLE.BIN	Working		htdocs
Windows 10	desktop.ini	tag_samples.txt

複数のディレクトリを指定

ls コマンドは複数のディレクトリを指定することができます。

以下はドキュメント(書類)とデスクトップの一覧を表示させる例です。

ls Documents Desktop return
Desktop:
$RECYCLE.BIN	Working		htdocs
Windows 10	desktop.ini	tag_samples.txt

Documents:
$RECYCLE.BIN	Default.rdp	backup_2019	desktop.ini

-a 隠しファイルを表示

先頭が . で始まるファイルやディレクトリは隠しファイル(ドットファイル)と呼ばれ、デフォルトでは表示されません。

隠しファイルを表示するには -a オプションを指定します。以下はルートディレクトリの隠しファイルも表示する例です。

表示された一覧の . と .. はファイルではなく、それぞれ「カレントディレクトリ」と「1つ上のディレクトリ」を表します。

ls -a / return
.					Quarantine
..					System
.DS_Store				Users
.DocumentRevisions-V100			Volumes
.PKInstallSandboxManager		bin
.PKInstallSandboxManager-SystemSoftware	cores
.Spotlight-V100				dev
.Trashes				etc
.com_kaspersky_ids_drop			home
.com_kaspersky_iswift_journal		installer.failurerequests
.file					net
.fseventsd				private
.vol					sbin
Applications				tmp
Library					usr
Network					var

-l 詳細表示

-l オプション(小文字のエル)を指定すると1行ずつファイルやディレクトリの詳細を表示します。

以下はルートディレクトリの一覧を詳細表示する例です。

各列は以下のような内容が表示されています。

  • ファイルタイプを表す文字(下記参照)と9桁のパーミッションと拡張属性や拡張セキュリティ情報(Access Control List など)の有無を表す文字(@ や +)
    • b:Block special file
    • c:Character special file
    • d:Directory(ディレクトリ)
    • l:Symbolic link(シンボリックリンク)
    • s:Socket link
    • p:FIFO
    • -:Regular file(普通のファイル)
  • ハードリンク数(別の名前で参照しているリンクの数)
  • オーナー(以下の場合すべて root)
  • 所有グループ
  • サイズ(バイト)
  • 更新日時
  • ファイル名
ls -l / return
total 13
drwxrwxr-x+ 66 root  admin  2112  8 11 06:44 Applications
drwxr-xr-x+ 67 root  wheel  2144  8  9 14:21 Library
drwxr-xr-x   2 root  wheel    64  2 26 13:49 Network
drwxrwx---   2 root  499      64  7 31 13:15 Quarantine
drwxr-xr-x@  5 root  wheel   160  5  4 14:21 System
drwxr-xr-x   5 root  admin   160  8  7 11:11 Users
drwxr-xr-x+  5 root  wheel   160  8 11 16:44 Volumes
drwxr-xr-x@ 37 root  wheel  1184  8  6 17:37 bin
drwxrwxr-t   2 root  admin    64  2 26 13:49 cores
dr-xr-xr-x   3 root  wheel  4494  8 11 06:42 dev
lrwxr-xr-x@  1 root  wheel    11  5  4 18:12 etc -> private/etc
dr-xr-xr-x   2 root  wheel     1  8 11 14:44 home
-rw-r--r--   1 root  wheel   313  2 25 12:18 installer.failurerequests
dr-xr-xr-x   2 root  wheel     1  8 11 14:44 net
drwxr-xr-x   6 root  wheel   192  5  4 14:23 private
drwxr-xr-x@ 64 root  wheel  2048  8  6 17:37 sbin
lrwxr-xr-x@  1 root  wheel    11  5  4 18:12 tmp -> private/tmp
drwxr-xr-x@  9 root  wheel   288  5  4 14:14 usr
lrwxr-xr-x@  1 root  wheel    11  5  4 18:13 var -> private/var

ファイルサイズはバイトで表示されていますが、-h オプションをお合わせて指定すると単位付きで表示されます。

ls -lh / return
total 13
drwxrwxr-x+ 66 root  admin   2.1K  8 11 06:44 Applications
drwxr-xr-x+ 67 root  wheel   2.1K  8  9 14:21 Library
drwxr-xr-x   2 root  wheel    64B  2 26 13:49 Network
drwxrwx---   2 root  499      64B  7 31 13:15 Quarantine
drwxr-xr-x@  5 root  wheel   160B  5  4 14:21 System
drwxr-xr-x   5 root  admin   160B  8  7 11:11 Users
drwxr-xr-x+  5 root  wheel   160B  8 11 16:44 Volumes
drwxr-xr-x@ 37 root  wheel   1.2K  8  6 17:37 bin
...

-F ファイルの性質を表す文字をファイル名の末尾に付加

  • ディレクトリ名: /
  • 実行可能ファイル:*
  • シンボリックリンク: @
  • FIFO名: |
  • ソケット: =

通常のファイルの後には何も付けません。

ls -F / return
Applications/			etc@
Library/			home/
Network/			installer.failurerequests
Quarantine/			net/
System/				private/
Users/				sbin/
Volumes/			tmp@
bin/				usr/
cores/				var@
dev/

ls コマンドのオプション

man コマンドで調べると以下のように ls コマンドには多数のオプション(-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1)があります。

NAME
     ls -- list directory contents

SYNOPSIS
     ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1] [file ...]

以下はオプションの一部抜粋です。

ls オプション(一部)
オプション 意味
-@ -l と併用して拡張属性のキーとサイズを表示
-a 隠しファイルも含め全てのファイルを表示
-A 「.」と「..」以外の全てのファイルを表示
-d ディレクトリそのものの情報を表示(再帰的に中を辿らない)
-e -l オプションと併用して Access Control List (ACL) の情報を標示
-F ファイルの性質を表す文字をファイル名の末尾に付加して表示。ディレクトリの後に「/」、実行可能ファイルの後に「*」、シンボリックリンクの後に「@」、FIFO名の後に「|」、ソケットの後に「=」を出力。
-h -l オプションと併用してファイルサイズにメガやキロの単位(M:1048576,K:1024)を付加
-i i-node 番号(ファイルのシリアル番号/ID)を表示
-l (小文字のエル)各項目の詳細情報を長いフォーマットで出力
-r 逆順にソートして出力
-S サイズでソートして,最も大きいファイルを先頭にサイズ順に出力
-s ファイルのブロック数を出力
-T -l (小文字のエル)オプションと併用して時刻情報も表示
-t 修正時刻でソートして出力(最新の修正が先頭)
-1 (数字の1)リストを1件1行で表示する(1ファイル1行で出力)
cd ディレクトリの移動

現在の作業ディレクトリを移動するには cd コマンドを使います。

cd ディレクトリのパス

以下は cd コマンドを使って作業ディレクトリ(現在のディレクトリ)を移動する例です。

cd /  return  #ルートディレクトリへ
            
cd ~  return  #ホームディレクトリへ

cd Desktop  return  #デスクトップへ

cd /Applications/MAMP/htdocs   return  #MAMP の htdocs へ

パスを Finder からドラッグ&ドロップ

パスを入力する際は、tab の入力補完が使えますが、Finder のフォルダやファイルをターミナルにドラッグ&ドロップしてパスをコマンドラインに入力することもできます。

ターミナルで「cd 」と入力してから Finder からフォルダをドラッグします(cd の後には半角スペースを入れます)。

フォルダをターミナルにドラッグアンドドロップする際のスクリーンショット

ホームディレクトリに戻る

ホームディレクトリに戻るには、cd コマンドに何も指定しないで実行します。

cd  return 
pwd カレントディレクトリのパスを表示

pwd コマンドはカレントディレクトリ(現在の作業ディレクトリ)のパスを表示します。

pwd  return
/Applications/MAMP/conf/apache/extra  #現在作業しているディレクトリのパス

テキストファイルの表示

cat

cat コマンドはファイルを連結する(concatenate)ためのコマンドですが、ファイルの内容を表示する際によく使われます。

但し、大きなテキストファイルを閲覧する場合、cat コマンドではスクロールして戻らなければならないため、ページ単位(1画面ずつ)で表示する less コマンドを使うと便利です。

cat [オプション] ファイル1 ファイル2 ...

以下はホームディレクトリからデスクトップにある sample.txt というファイルの内容を表示する例です。

cat Desktop/sample.txt  return
Sample text
A
B
C

-n オプションを指定すると行番号が表示されます。

cat -n Desktop/sample.txt  return
     1	Sample text
     2	A
     3	B
     4	C

cat コマンドは、ファイルが複数指定された場合、そのまま連続して表示します。

その内容をリダイレクトして、複数のファイルを連結して新しいファイルを作成することができます。

以下は cat コマンドを使って、「sample1.txt」と「ample2.txt」を連結して、新たに「sample_cat.txt」を作成する例です。

cat sample1.txt   return  //内容を確認
sample #1
abcdefg

cat sample2.txt   return  //内容を確認
sample #2
1234567

cat sample1.txt sample2.txt  return  //連続して表示
ample #1
abcdefg
sample #2
1234567

//リダイレクトで sample_cat.txt を作成
cat sample1.txt sample2.txt > sample_cat.txt  return  
cat sample_cat.txt  return  //内容を確認
sample #1
abcdefg
sample #2
1234567

man cat でマニュアルを見ると以下のように記載されていています。

man cat    return
CAT(1)                    BSD General Commands Manual                   CAT(1)

NAME
     cat -- concatenate and print files

SYNOPSIS
     cat [-benstuv] [file ...]

DESCRIPTION
     The cat utility reads files sequentially, writing them to the standard
     output.  The file operands are processed in command-line order.  If file
     is a single dash ('-') or absent, cat reads from the standard input.  If
     file is a UNIX domain socket, cat connects to it and then reads it until
     EOF.  This complements the UNIX domain binding capability available in
     inetd(8).

・・・以下省略・・・

「DESCRIPTION」には「cat コマンドは指定されたファイルを連続して読み込んで標準出力(ターミナル画面)に出力します。ファイルはコマンドラインに指定された順番で処理されます。シングルダッシュが指定されるかまたはファイルが指定されていない場合は cat コマンドは標準入力(キーボード)からの入力を読み込みます。... 」と書かれています。

以下のように引数に何も指定せずに cat コマンドを実行すると、キーボード(標準入力)からの入力を読み取り、そのまま画面(標準出力)に出力します。

終了するには control + d を押します。

cat    return
hello cat!    return
hello cat!   //入力された文字が出力される
cat test    return
cat test   //入力された文字が出力される
control + d で終了

cat コマンドを実行中に control + d を押すと「End Of File/EOF」と言う入力の終了を示す信号が送られて cat コマンドが終了します。

何もコマンドを実行していない状態で control + d を押すと「入力の終了」、つまり「シェルを終了」という動作になりターミナルからログアウトするので注意が必要です。

less

less コマンドは、テキストファイルを1画面ずつ表示します。

UNIX には似たようなコマンドに more というコマンドがありますが、masOS の場合は more コマンドと less コマンドを統合して同一のコマンドとして提供しているようです(man more とすると less のマニュアルが開きます)。

以下が書式です。

less [オプション] ファイル名

less コマンドにはオプションが多数ありますが、以下はその一部です。

オプション 意味
+行数 指定した行から表示
-p文字列 指定した文字列を検索して見つけた行から表示(または --pattern=文字列)
-N 行番号を表示

以下はカレントディレクトリの sample.txt を表示する例です。

less sample.txt   return

以下は httpd.conf というファイルを50行目(+50)から行番号付き(-N)で表示する例です。

less -N +50 /Applications/MAMP/conf/apache/httpd.conf    return
     50 #
     51 # Dynamic Shared Object (DSO) Support
     52 #
     53 # To be able to use the functionality of a module which was built as a D     53 SO you
     54 # have to place corresponding `LoadModule' lines at this location so the
     55 # directives contained in it are actually available _before_ they are us     55 ed.
     56 # Statically compiled modules (those listed by `httpd -l') do not need
     57 # to be loaded here.
     58 #
     59 # Example:
     60 # LoadModule foo_module modules/mod_foo.so
     61 #
     62 LoadModule authn_file_module modules/mod_authn_file.so
     63 LoadModule authn_dbm_module modules/mod_authn_dbm.so
     64 LoadModule authn_anon_module modules/mod_authn_anon.so
     65 LoadModule authn_dbd_module modules/mod_authn_dbd.so
     66 LoadModule authn_default_module modules/mod_authn_default.so
     67 LoadModule authz_host_module modules/mod_authz_host.so
     68 LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
     69 LoadModule authz_user_module modules/mod_authz_user.so
     70 LoadModule authz_dbm_module modules/mod_authz_dbm.so
/Applications/MAMP/conf/apache/httpd.conf     

以下は、「FollowSymLinks」と言う文字列を検索(-p)してその文字列のある行から表示する例です。

less -pFollowSymLinks /Applications/MAMP/conf/apache/httpd.conf    return
          
Options Indexes FollowSymLinks
    AllowOverride None
</Directory>

#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#

#
# This should be changed to whatever you set DocumentRoot to.
#
<Directory "/Applications/MAMP/htdocs">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
/Applications/MAMP/conf/apache/httpd.conf

以下のキー操作が可能です。

キー 操作
return 一行分スクロール
e 一行分スクロール
y 一行分戻る
一行分スクロール
一行分戻る
space 1画面分スクロール
b 1画面分戻る
d 半画面分スクロール
u 半画面分戻る
g 先頭行に移動
shift + g 最後の行に移動
control + g 現在の表示位置を表示
行番号 + g 指定した行に移動
h ヘルプを表示
q 終了
/ / に続けて検索文字列(パターン)を入力
? 後ろ方向に検索(? に続けて検索文字列を入力)
n 次を検索
shift + n 逆順に次を検索

文字列を検索

less コマンドで内容を表示している際に文字列を検索するには、/ に続けて検索したい文字列を入力し、return を押します。

検索を続ける(同じ文字列を同じ方向に検索する)場合は n を押し、逆方向に検索する場合は shift + n を押します。

逆方向(後ろ方向)に検索するには、/ の代わりに ? と検索する文字列を入力して return を押します。

以下は less コマンドで php.ini というファイルを開いて文字列を検索する例です。

less /Applications/MAMP/conf/php5.5.5/php.ini    return

ファイルが開きます。

less コマンドで php.ini というファイルを開いた状態のスクリーンショット

/ に続けて検索したい文字列(以下の例では max_)を入力すると左下にその文字列が表示されます。

/に続けて検索したい文字列「max_」を入力した状態のスクリーンショット

続けて return を押すと、検索した文字列へジャンプしてマッチした文字列がハイライトされます。

検索した文字列へジャンプしてマッチした文字列がハイライトされた状態のスクリーンショット

head / tail

head コマンドはテキストファイルの先頭部分(デフォルトでは最初の10行)を、tail コマンドは末尾部分(デフォルトでは最後の10行)を表示します。

表示する行数は、オプション(-n)で変更することができます。

head [-n 行数] ファイル名

以下は head コマンドに -n オプションを指定して ssh_config ファイルの先頭の5行を表示する例です。

オプションの n を省略して「-5」のように「-数字」で行数を指定することもできます。

head -n 5 /etc/ssh/ssh_config     return(head -5 /etc/ssh/ssh_config でも可)
#	$OpenBSD: ssh_config,v 1.33 2017/05/07 23:12:57 djm Exp $

# This is the ssh client system-wide configuration file.  See
# ssh_config(5) for more information.  This file provides defaults for
# users, and the values can be changed in per-user configuration files

tail [-n 行数] ファイル名

以下は tail コマンドに -n オプションを指定して ssh_config ファイルの最後の5行を表示する例です。

オプションの n を省略して「-5」のように「-数字」で行数を指定することもできます。

tail -n 5 /etc/ssh/ssh_config      return(tail -5 /etc/ssh/ssh_config でも可)
#   ProxyCommand ssh -q -W %h:%p gateway.example.com
#   RekeyLimit 1G 1h

Host *
	SendEnv LANG LC_*

ログファイルの監視

tail コマンドに -f オプションを指定して実行すると、コマンドは終了せずに刻々と内容が追加されていくようなファイル(ログファイルなど)を監視することができます。

コマンド(ログの監視)を終了するには control + c を押します。

以下はシステム情報のログ(system.log)を監視する例です。

tail -f /var/log/system.log      return
Aug 19 09:20:46 x01 logd[60]: #DECODE failed to resolve UUID:...
......
          
//終了するには control + c を押します

n 行目から m 行目を表示

パイプを使って head と tail を組み合わせるとファイルの途中(n 行目から m 行目)を表示することができます。

以下は /etc/services の41行目から50行目を表示する例です。

head コマンドの先頭から50行目の出力結果をパイプで tail コマンドに渡して最後の10行を表示しています。、

head -n 50 /etc/services | tail -n 10     return
echo              7/tcp     # Echo
#                          Jon Postel <postel@isi.edu>
#                 8/tcp    Unassigned
#                 8/udp    Unassigned
discard           9/udp     # Discard
discard           9/tcp     # Discard
#                          Jon Postel <postel@isi.edu>
#                10/tcp    Unassigned
#                10/udp    Unassigned
systat           11/udp     # Active Users

以下は cat コマンドと組み合わせて行番号も表示する例です。

cat -n /etc/services | head -n 50 | tail -n 10     return
    41	echo              7/tcp     # Echo
    42	#                          Jon Postel <postel@isi.edu>
    43	#                 8/tcp    Unassigned
    44	#                 8/udp    Unassigned
    45	discard           9/udp     # Discard
    46	discard           9/tcp     # Discard
    47	#                          Jon Postel <postel@isi.edu>
    48	#                10/tcp    Unassigned
    49	#                10/udp    Unassigned
    50	systat           11/udp     # Active Users

ファイルやディレクトリの基本操作

cp コピー

ファイルやディレクトリをコピーするには cp コマンドを使用します。

以下が書式です。

cp [オプション] コピー元ファイル コピー先ファイル

cp [オプション] コピー元ファイル1  コピー元ファイル2 ...  コピー先ディレクトリ

以下はホームディレクトリでデスクトップにある sample.txt というファイルを Documents ディレクトリに sampleCopy.txt という名前でコピーする例です。

cp Desktop/sample.txt Documents/sampleCopy.txt  return

コピー先にディレクトリを指定

コピー先にディレクトリを指定した場合は、そのディレクトリにコピー元のファイルと同じ名前のファイルが作成されます。

同じファイル名でコピーする場合は、コピー先にはディレクトリのみを指定すれば大丈夫です。

cp Desktop/sample.txt Documents/  return #同じファイル名でコピー

カレントディレクトリに同じファイル名でコピーする場合は、以下のようにコピー先にカレントディレクトリを表すドット(.)を指定することができます。

cp Desktop/sample.txt . return #カレントディレクトリに同じファイル名でコピーする場合

複数のファイルをまとめてコピーすることもできます。コピー先にはディレクトリを指定します。

以下の例の場合、コピー先の Documents ディレクトリには、sample.txt と sample2.txt がコピーされます。

cp Desktop/sample.txt Desktop/sample2.txt Documents/ return

ワイルドカードを使ってコピー元のファイルを指定して、複数のファイルをコピーすることができます。

cp Desktop/*.txt Documents/ return

-v コピーの状況を表示

-v オプションを付けて実行すると、コピーしたファイルの名前が表示されるので実行内容を確認することができます。

cp -v Desktop/*.txt Documents/ return #以下のようにコピー内容が出力されます。
Desktop/sample.txt -> Documents/sample.txt
Desktop/sample2.txt -> Documents/sample2.txt
Desktop/sample3.txt -> Documents/samples3.txt 

-R ディレクトリを丸ごとコピー

ディレクトリの中身も含めて全てコピーしたい場合は、-R オプションを指定します。

「-R」は、ファイルを「再帰的(Recursive)にコピーする」というオプションで、指定したディレクトリの中にサブディレクトリが存在すればそれもコピーされます。

但し、コピー先のディレクトリが存在するかどうかで動作が異なります。

コピー前のディレクトリの状態のスクリーンショット

コピー先のディレクトリが存在しない場合、例えば以下の例ではコピー先のディレクトリ(testBackup)が作成されてその中にコピー元のディレクトリ(testDir)の中身がコピーされます。

cp -R testDir testBackup return

コピー後のディレクトリの状態のスクリーンショット

コピー先のディレクトリが存在する場合は、コピー先のディレクトリ(testBackup)の下にコピー元ディレクトリ(testDir)がディレクトリごとコピーされます。

コピー先のディレクトリが存在する場合のコピー後のディレクトリの状態のスクリーンショット

コピー先のディレクトリが既に存在する場合に、コピー元のディレクトリを作成したくない場合は、以下のようにコピー元の中身をコピーするようにすることができます。

cp -R testDir/* testBackup return

ディレクトリ名の末尾に「/」を付けても、付けなくても動作は同じです。以下は全て同じ結果になります。

cp -R testDir testBackup
cp -R testDir  testBackup/
cp -R testDir/ testBackup
cp -R testDir/ testBackup/

-r オプション

マニュアル(man cp)を見ると -r オプション(-R とほぼ同じ?)もサポートされていますが、以下のように記載されていて使用しないほうが良いようです。

COMPATIBILITY
Historic versions of the cp utility had a -r option. This implementation supports that option; however, its use is strongly discouraged, as it does not correctly copy special files, symbolic links, or fifo's.

-i 上書きの確認

デフォルトでは cp コマンドは、コピー先のファイルが存在している場合は警告なしで上書きします。

上書きするかどうかを確認するには、-i オプションを指定します。

cp -Ri testDir/* testBackup   return
overwrite testBackup/sample.txt? (y/n [n]) n
not overwritten
overwrite testBackup/sample2.txt? (y/n [n]) n 
not overwritten
overwrite testBackup/sample3.txt? (y/n [n]) n
not overwritten
overwrite testBackup/testSubDir/sample_sub.txt? (y/n [n]) n
not overwritten

cp コマンドの主なオプション

オプション 意味
-a -pPR と指定した場合と同じ。サブディレクトリや属性などを可能な限り保持してコピー
-f 強制的に上書き
-i 上書きする前に確認
-n 既存のファイルを上書きしない
-P コピー元にあるシンボリックリンクをたどらない
-p パーミッションや所有者、タイムスタンプなどを保持(可能であれば、以下が保持される)
  • modification time
  • access time
  • file flags
  • file mode
  • user ID
  • group ID
  • Access Control Lists (ACLs)
  • Extended Attributes (EAs)
-R コピー元にディレクトリを指定した場合、再帰的に(サブディレクトリも含めて)コピー
-v コピーの状況(実行内容)を表示

mv 移動

ファイルやディレクトリを移動するには mv コマンドを使用します。名前を変更する場合にも使用できます。

以下が書式です

mv [オプション] 元のファイル 移動先ファイル

mv [オプション] 元のファイル1  元のファイル2 ...  移動先ディレクトリ

以下はカレントディレクトリの sample.txt を testSubDir ディレクトリに sample_mv.txt という名前で移動(リネーム)する例です。

mv sample.txt testSubDir/sample_mv.txt   return

同じファイル名で移動する場合は、移動先のディレクトリを指定し、ファイル名を省略できます。

以下はカレントディレクトリの sample.txt を testSubDir ディレクトリに同じ名前で移動する例です。

mv sample.txt testSubDir/   return

移動先ファイルに既存のファイルを指定すると「上書き」になります。

デフォルトでは、移動先のファイルが存在している場合は警告なしで上書きします。上書きするかどうかを確認するには、-i オプションを指定します。

mv -i sample.txt testSubDir/sample.txt   return
overwrite testSubDir/sample.txt? (y/n [n]) n  //n を押してキャンセル
not overwritten

また、名前を変えて同じ場所(ディレクトリ)に移動することもでき、結果的に名前を変更(リネーム)することになります。

以下はカレントディレクトリの sample.txt を sample_new.txt に名前を変更する例です。

mv sample.txt sample_new.txt   return

mv コマンドはディレクトリに対しても使用することができます。以下は testBackup と言うディレクトリを testBk という名前に変更する例です。

mv testBackup testBk   return

以下は主なオプションです。

オプション 意味
-f 強制的に上書き
-i 上書きする前に確認
-n 既存のファイルを上書きしない
-v 移動の状況(実行内容)を表示

rm 削除

ファイルやディレクトリを削除するには rm コマンドを使用します。

以下が書式です。ファイルやディレクトリは複数指定できます。

rm [オプション] ファイルまたはディレクトリ ...

※ GUI のゴミ箱に入れる操作とは異なり、削除したファイルを元に戻すことはできません。

以下はカレントディレクトリの sample.txt を削除する例です。

rm sample.txt   return

-i オプションで確認しながら削除

-i オプションを指定すると、ファイルを削除して良いかを確認します。

以下は のワイルドカードを使って testBk ディレクトリのファイルを全て削除する際に -i を指定して確認しながら削除する例です。

削除して良い場合は、y を入力して return を押します。

rm -i testBk/*   return
remove testBk/sample.txt? y  
remove testBk/sample2.txt? y
remove testBk/sample3.txt? y
rm: testBk/testSubDir: is a directory

-r オプションでディレクトリごと削除

-r オプションを指定すると、指定したディレクトリごと配下のファイルを全て削除します。

以下は testDir ディレクトリを丸ごと削除する例です。

rm -r testDir   return

アクセス権限(パーミッション)で「書き込み」が許可されていないファイルがある場合は、削除して良いかを確認してきます。

削除する際に、-f オプションを指定すると「書き込み」が許可されていない場合でも確認せずに削除されます。

ドットファイル(隠しファイル)の削除

ワイルドカード * を指定しても、ドットファイル(隠しファイル)は削除対象になりません。ドットファイルを削除する場合はドットを含めたファイル名を指定するか、ディレクトリごと削除します。

rm testBk/.sampleDot.txt   return

以下は主なオプションです。

オプション 意味
-f メッセージを表示せずに削除
-i 削除する前に確認
-r ディレクトリを中身ごと削除
-v 削除の状況(実行内容)を表示

ハードリンクとシンボリックリンク

macOS のエイリアスのようなファイルやディレクトリに別名を付ける仕組みをリンクと呼びます。

Unix 系システムのリンクにはハードリンクとシンボリックリンクがあります。

ln リンクの作成

ハードリンクやシンボリックリンクを作成(追加)するには ln コマンド(エルの小文字と n)を使用します。

以下が書式です。

ln [オプション] ファイル名 リンク名

通常リンクを作成する場合は、より扱いやすく自由度の高いシンボリックリンクを作成して使うことが多いようです。

シンボリックリンクの作成(-s)

シンボリックリンクを作成するには ln コマンドに -s オプションを指定して実行ます。

以下はカレントディレクトリの 01.jpg というファイルのシンボリックリンクを 01_slink.jpg という名前で作成する例です。

ln -s 01.jpg 01_slink.jpg    return

以下は実行後に ls コマンドで一覧表示した場合の例です。

-l オプションを指定して詳細を表示しています。

シンボリックリンクの左端のファイルタイプを表す文字は「l(Symbolic link)」になっていて、ファイル名の部分には「 -> 01.jpg」のように元のファイルのパスが表示されています。

また、シンボリックリンクはリンク先のパス名だけが保存されている擬似的なファイルなので、元のファイルのサイズ(94415バイト)と比べるととても小さなサイズ(6バイト)になっています。

ls -l   return
total 192
-rw-r--r--@ 1 foo  staff  94415  8  8 10:31 01.jpg
lrwxr-xr-x  1 foo  staff      6  8 16 19:54 01_slink.jpg -> 01.jpg

シンボリックリンクは Finder で見るとエイリアスとして表示されます。

シンボリックリンクを Finder で見たスクリーンショット

パスの指定

シンボリックリンクを作成する際に、ファイルを相対パスで指定する場合は、リンクからの相対パスで指定する必要があります。

ln -s ファイル名(リンクファイルからの相対パス) リンク名

以下はユーザのホームディレクトリで Documents ディレクトリの sample.txt へのシンボリックリンクを Desktop に sample_slink.txt として作成する場合の例です。

ln -s ../Documents/sample.txt Desktop/sample_slink.txt   return

以下は絶対パスで指定する場合の例です。

ln -s ~/Documents/sample.txt Desktop/sample_slink.txt   return 

ディレクトリへのシンボリックリンク

シンボリックリンクはディレクトリに対しても作成することができます。

以下は /Applications/MAMP/htdocs へのシンボリックリンクをホームディレクトリに web として作成する例です。このようなシンボリックリンクを作成しておけば、cd web や ls web で /Applications/MAMP/htdocs/ へ移動したり内容を確認できます。

ln -s /Applications/MAMP/htdocs/ web   return

ハードリンクの作成

ハードリンクは同じファイルの実態を異なる名前で参照できるようにする仕組みで、リンク元やリンク先という区別がありません。

ハードリンクを作成するには、オプションを指定せず ln コマンドを実行します。

以下はカレントディレクトリの 01.jpg というファイルのハードリンクを 01_hlink.jpg という名前で作成する例です。

ln 01.jpg 01_hlink.jpg   return

以下は実行後に ls コマンド で一覧表示した場合の例です。

-il オプションを指定して i-node 番号を含む詳細を表示しています。

ハードリンクの場合、実態が同じなので i-node 番号が同じになっていますが、この情報を見ない限りこの2つが同じものかどうかを判断することができません。

また、アクセス権限(パーミッション)やサイズ、作成日時など名前以外は全て同じになっているので、どちらが先に作成されたかはわかりません(この例の場合は名前から推測できますが)。

ls -il   return
total 384
3795989 -rw-r--r--@ 2 foo  staff  94415  8  8 10:31 01.jpg
3795989 -rw-r--r--@ 2 foo  staff  94415  8  8 10:31 01_hlink.jpg
//以下は別途作成したシンボリックリンク
3796153 lrwxr-xr-x  1 foo  staff      6  8 16 19:54 01_slink.jpg -> 01.jpg

一覧表示の左から3列目の「2」はハードリンクの数です。

ハードリンクを追加すると数が増えていき、ファイルを削除すると数が減り、0になるとディスクから完全に削除されます。

ハードリンクは Finder で見ると以下のように元のファイルと同じように表示されます。

ハードリンクを Finder で見たスクリーンショット

mkdir ディレクトリの作成

ディレクトリを作成するには mkdir コマンドを使います。

以下が書式です。

mkdir [オプション] ディレクトリ名

以下はホームディレクトリに myDir というディレクトリを作成する例です。

mkdir ~/myDir   return

サブディレクトリを含めて作成 -p

オプションなしで mkdir を実行する場合、途中のディレクトリは既に存在している必要があります。

例えば、前述で作成したディレクトリの下に myDir/foo/bar/ というディレクトリを作成する場合はその時点で myDir/foo が存在している必要があります。

mkdir ~/myDir/foo/bar   return
mkdir: /Users/xxxx/myDir/foo: No such file or directory

-p オプションを指定すると途中のディレクトリも作成してくれます。

mkdir -p ~/myDir/foo/bar   return

rmdir ディレクトリの削除

空のディレクトリは rmdir コマンドで削除できます。

rmdir ~/myDir/foo/bar   return

但し、ディレクトリの中にサブディレクトリやファイルがある場合は削除することができません。

rmdir ~/myDir   return
rmdir: /Users/xxxx/myDir: Directory not empty

そのような場合は rm コマンドに -r オプションを指定して実行します。

-r オプションを指定して rm コマンドを実行すると、指定したディレクトリごと配下のファイルやディレクトリを全て削除します。

rm -r ~/myDir   return

※ GUI のゴミ箱に入れる操作とは異なり、削除したファイルを元に戻すことはできません。必要に応じて -i オプションを指定して確認しながら削除することもできます。

rm -ir ~/myDir   return
examine files in directory /Users/xxxx/myDir? y
examine files in directory /Users/xxxx/myDir/foo? y
examine files in directory /Users/xxxx/myDir/foo/bar? y
remove /Users/xxxx/myDir/foo/bar? y
remove /Users/xxxx/myDir/foo? y
remove /Users/xxxx/myDir? y

stat 属性や日付などを表示

stat コマンドはファイルまたはディレクトリの状態を表示します。

以下が書式です。

stat [オプション] パス

以下が stat コマンドの主なオプションです。

オプション 意味
-F ディレクトリの場合は最後にスラッシュ(/)を、実行ファイルの場合はアスタリスク(*)を、シンボリックリンクの場合は @ を最後に付けて表示。表示形式は -l オプションと同じ
-L シンボリックリンクファイルを指定した場合,リンクをたどった先のファイルまたはディレクトリの状態を表示
-f format(フォーマット) フォーマットを指定して表示。以下はフォーマットの例(一部抜粋)
  • %d:デバイス番号
  • %i:i-node 番号
  • %p:ファイルタイプとパーミッション
  • %l:ハードリンク数
  • %a:最終アクセス日時のタイムスタンプ
  • %m:最終更新日時のタイムスタンプ
  • %c:最終状態変更日時のタイムスタンプ
  • %N:ファイル名
  • %z:ファイルサイズ
-l (エルの小文字)ls コマンドに -lT オプションを指定した形式で表示
-x 項目を表示(more verbose way)

以下は sample.txt というファイルの状態を調べる例です。

デバイス番号、i-node 番号、パーミッションやタイムスタンプなどが表示されています。

stat sample.txt   return
16777220 4107690 -rw-r--r-- 1 foo staff 0 0 "Aug 25 16:15:15 2019" "Aug 25 16:15:22 2019" "Aug 25 16:15:22 2019" "Aug 25 16:14:43 2019" 4096 0 0 sample.txt

以下のように -x オプションを指定すると項目が表示されるのでわかりやすいです。

stat -x sample.txt   return
  File: "sample.txt"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/  foo)  Gid: (   20/   staff)
Device: 1,4   Inode: 4107690    Links: 1
Access: Sun Aug 25 16:15:15 2019
Modify: Sun Aug 25 16:15:22 2019
Change: Sun Aug 25 16:15:22 2019

以下は -f を使ってフォーマットを指定して表示する例です。

stat -f "Device Num:%d i-node: %i atime: %a file-type permission: %p" sample.txt   return
Device Num:16777220 i-node: 4107690 atime: 1566717315 file-type permission: 100644

以下は -l オプションを指定して表示する例です。

ls コマンドの ls -lT の実行結果とほぼ同じです。

stat -l sample.txt    return
-rw-r--r-- 1 foo staff 0 Aug 25 16:15:22 2019 sample.txt

ls -lT sample.txt    return
-rw-r--r--  1 foo  staff  0  8 25 16:15:22 2019 sample.txt

touch タイムスタンプを変更/新規ファイルを作成

touch コマンドは指定したファイルやディレクトリのタイムスタンプ(最終アクセス日時と最終更新日時)を変更します。

また,存在しないファイル名を指定した場合は新規に(デフォルトのパーミッションで)空のファイルが作成されます。

以下は touch コマンドの書式です。

touch [オプション] ファイル1 ファイル2 ...

以下は touch コマンドの主なオプションです。

オプション 意味
-a 最終アクセス日時のみ変更する
-c 存在しないファイル名を指定した場合に新規ファイルを作成しない
-f アクセス権がなくても強制的に更新を試みる
-h シンボリックリンクの場合、リンク先ではなくシンボリックそのもののタイムスタンプを変更する。このオプションを指定すると -c を指定したのと同様に新規ファイルを作成しない。
-m 最終更新日時のみ変更する
-r 現在の時刻ではなく指定したファイルのタイムスタンプを使う
-t 現在の時刻ではなくフォーマット([[CC]YY]MMDDhhmm[.SS])で指定した時刻を使う

オプションを何も付けない場合はタイムスタンプ(最終アクセス日時と最終更新日時)が現在の時刻に書き換えられます。

以下はオプションを指定せずに touch コマンドを実行してタイムスタンプを現在の時刻に書き換える例です。

以下では stat コマンドを使ってタイムスタンプを確認しています。

stat -x sample.txt     return //状態を確認
  File: "sample.txt"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/  foo)  Gid: (   20/   staff)
Device: 1,4   Inode: 4107690    Links: 1
Access: Sun Aug 25 16:15:15 2019
Modify: Sun Aug 25 16:15:22 2019
Change: Sun Aug 25 16:15:22 2019

touch sample.txt     return //タイムスタンプを現在時刻に書き換え

stat -x sample.txt     return
  File: "sample.txt"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/  foo)  Gid: (   20/   staff)
Device: 1,4   Inode: 4107690    Links: 1
Access: Tue Aug 27 11:41:18 2019
Modify: Tue Aug 27 11:41:17 2019
Change: Tue Aug 27 11:41:17 2019

以下は、-r オプションを指定して 01.txt のタイムスタンプを使って sample.txt のタイムスタンプを書き換える例です。

touch -r 01.txt sample.txt 

空のファイルを作成

touch コマンドで指定したファイルが存在しない場合は、空のファイルが作成されます。

もし、ファイルが存在していると、そのファイルのタイムスタンプが変更されます。

ls    return
sample1.txt  //1つのファイルのみ

touch sample2.txt    return  //sample2.txt を作成

ls    return
sample1.txt	sample2.txt

touch -c sample3.txt    return  // -c オプションを付けて実行
//-c オプションを付けているので sample3.txt は作成されない(エラーも表示されない)

ls    return
sample1.txt	sample2.txt 

find ファイルやディレクトリの検索

find コマンドを使うとさまざまな条件でファイルを検索することができます。

以下が書式です。

find [オプション] [検索パス] [検索条件]

find コマンドは引数で指定した[検索パス]のディレクトリを起点にして、その下のディレクトリを順にたどってファイル(及びディレクトリ)を検索します。

マッチするファイルが見つかっても検索は終了せず配下の全てのディレクトリが検索されます。

以下は find コマンドのオプション(シンボリックリンクをどう処理するか)です。

オプション 意味
-H 引数として指定したシンボリックリンクをたどる
-L 全てのシンボリックリンクをたどる(すべてリンク先を参照して処理を継続)
-P シンボリックリンクをたどらない(デフォルト)

例えば、以下のように検索パスにカレントディレクトリ(.)だけを指定して実行すると、カレントディレクトリ以下の全てのファイルとディレクトリが表示されます。

実行する場所によっては大量の出力になります。中断するには control + c を押します。

find .

例えば以下のようなホームディレクトリがある場合、

ホームディレクトリを Finder で見たスクリーンショット

検索パスに ~/test を指定すると以下のように ~/test 以下の全てファイルとディレクトリが表示されます。

find ~/test   return
/Users/xxxx/test
/Users/xxxx/test/link_test
/Users/xxxx/test/link_test/.DS_Store
/Users/xxxx/test/link_test/01.jpg
/Users/xxxx/test/link_test/sample_cat.txt
/Users/xxxx/test/link_test/sample1.txt
/Users/xxxx/test/link_test/sample2.txt
/Users/xxxx/test/.DS_Store

検索の条件や検索したファイルの扱いをプライマリと呼ばれるオプションや演算式を使って[検索条件]に指定できます。

例えば、名前で検索する場合は -name というプライマリ(オプション)を使って「-name ファイル名」のように指定します。

以下は ~/test 以下で sample1.txt というファイルを検索する例です。

find ~/test -name sample1.txt   return
/Users/xxxx/test/link_test/sample1.txt

ワイルドカード

ファイル名部分にワイルドカードを指定する場合は、シェルがワイルドカードを展開してしまう可能性があるので引用符(")で囲みます。

find ~/test -name "*.txt"   return
/Users/xxxx/test/link_test/sample_cat.txt
/Users/xxxx/test/link_test/sample1.txt
/Users/xxxx/test/link_test/sample2.txt

エラーメッセージを表示しない 2>/dev/null

検索する場所によっては、権限のない場所で検索されることにより大量のエラーメッセージが表示さます。

find . -name sample.txt   return
./Creative Cloud Files/pr/php/sample.txt
...
//以下はエラーメッセージの例
find: ./Library/Application Support/MobileSync: Operation not permitted  
find: ./Library/Application Support/CallHistoryTransactions: Operation not permitted
find: ./Library/Application Support/com.apple.TCC: Operation not permitted
find: ./Library/Application Support/CallHistoryDB: Operation not permitted
find: ./Library/IdentityServices: Operation not permitted
find: ./Library/Messages: Operation not permitted
find: ./Library/HomeKit: Operation not permitted
find: ./Library/Mail: Operation not permitted
find: ./Library/Safari: Operation not permitted
find: ./Library/Suggestions: Operation not permitted
find: ./Library/Containers/com.apple.VoiceMemos: Operation not permitted
find: ./Library/Containers/com.apple.Home: Operation not permitted
...
./.Trash/sample.txt
./Documents/sample.txt

2>/dev/null のようにエラーメッセージをヌルデバイスにリダイレクトするとエラーメッセージは表示されなくなります。

以下はエラーメッセージをヌルデバイスにリダイレクトする例です。

find . -name sample.txt 2>/dev/null   return
./Creative Cloud Files/pr/php/sample.txt
... 
//エラーメッセージは表示されない
./.Trash/sample.txt
./Documents/sample.txt

検索条件を指定するオプション(プライマリ)

以下は検索条件のための主なオプション(プライマリ)です。

オプション(プライマリ) 意味
-amin n(時間差) ファイルおよびディレクトリの最終アクセス時刻(access time)と,find が実行を開始した時刻の差(n 分)を指定して検索(1分未満は切り上げ)。
  • n: n 分ちょうど
  • -n: n 分より後(新しい)
  • +n: n 分より前(古い)
-atime n(時間差) ファイルおよびディレクトリの最終アクセス時刻(access time)と,find が実行を開始した時刻の差(n 日)を指定して検索(1日未満は切り上げ)。
  • n: n 日ちょうど
  • -n: n 日より後(新しい)
  • +n: n 日より前(古い)
-cmin n(時間差) ファイルおよびディレクトリの状態(コンテンツ、所有者、グループ、リンク数などの属性)が変更された時刻(change time)と,find が実行を開始した時刻の差(n 分)を指定して検索(1分未満は切り上げ)。change time:何らかの変更(内容や属性の変更)が発生した時刻
  • n: n 分ちょうど
  • -n: n 分より後(新しい)
  • +n: n 分より前(古い)
-ctime n(時間差) ファイルおよびディレクトリの状態(コンテンツ、所有者、グループ、リンク数などの属性)が変更された時刻(change time)と,find が実行を開始した時刻の差(n 日)を指定して検索(1日未満は切り上げ)。
  • n: n 日ちょうど
  • -n: n 日より後(新しい)
  • +n: n 日より前(古い)
-mmin n(時間差) ファイルおよびディレクトリの最終修正時刻(modification time)と,find が実行を開始した時刻の差(n 分)を指定して検索(1分未満は切り上げ)。modification time:内容の変更があった時刻(属性の変更は含まない)
  • n: n 分ちょうど
  • -n: n 分より後(新しい)
  • +n: n 分より前(古い)
-mtime n(時間差) ファイルおよびディレクトリの最終修正時刻(modification time)と,find が実行を開始した時刻の差(n 日)を指定して検索(1日未満は切り上げ)。
  • n: n 日ちょうど
  • -n: n 日より後(新しい)
  • +n: n 日より前(古い)
-empty 空のファイルの検索
-group グループ名 指定したグループに属するファイルを検索
-maxdepth n(深さ) 検索するディレクトリの最大の深さを指定
-mindepth n(深さ) 検索するディレクトリの最小の深さを指定
-iname パターン(名前) ファイル名またはディレクトリ名をパターン(または文字列)で指定して検索。※大文字小文字を区別しない
-name パターン(名前) ファイル名またはディレクトリ名をパターン(または文字列)で指定して検索
-newer パス名(ファイルのパス) 指定したファイルより後に修正されたファイルを検索
-perm パーミッション 指定したパーミッションが設定されているファイルを検索
-prune ディレクトリはたどらない(ディレクトリを除外)。-d オプションが指定されている場合は無効
-size サイズ 指定したサイズのファイルを検索。サイズのあとに c を指定するとバイト単位で、k を指定するとキロバイト単位で、M を指定するとメガバイト単位で、G を指定するとギガバイト単位で評価。
  • サイズ(記号なし):指定したサイズ
  • +サイズ:指定したサイズ以上
  • -サイズ:指定したサイズ以下
-type タイプ 指定したタイプのファイルを検索
  • b:ブロック型スペシャルファイル
  • c:キャラクタ型スペシャルファイル
  • d:ディレクトリ
  • f:通常のファイル
  • l:シンボリックリンク
-user ユーザー名 指定したユーザーに属するファイルを検索
-ls 検索結果をデフォルトの出力(-print)に代わり「ls -dgils」の形式で出力(i-node 番号、サイズ、ファイルパーミッション、ハードリンク数、所有者名、グループ、サイズ、最終修正時刻、パス名を出力)
-exec コマンド 検索したファイルおよびディレクトリ(検索結果)に対して処理をするコマンドを指定して実行
-exec コマンド {} \;
-ok コマンド 検索したファイルおよびディレクトリ(検索結果)に対して処理をするコマンドを指定して実行。-exec とは異なり、コマンドを実行する際に渡された検索結果(引数)を1つずつ確認して実行。
-ok コマンド {} \;
-print 検索結果をフルパスで出力(デフォルト)
-print0 検索結果を NULL 区切りのフルパスで出力

以下は ./test ディレクトリ以下で、サイズが1Mバイトより大きなファイルを検索する例です。

find ./test -size +1M   return

複数の条件を満たすファイルを検索

複数の検索条件を指定することで、全ての条件にマッチするファイルを検索することができます。

以下は ./test ディレクトリ以下の最終修正時刻が30分以上前、且つファイルのみを検索する例です。(-type f を指定しないとディレクトリも検索対象になります)

find ./test -mmin +30 -type f  return

いずれかの条件にマッチするファイルを検索 -o

-o で検索条件をつなげると、いずれかの条件にマッチするファイルを検索することができます。

以下は /Applications/MAMP/htdocs/wdl/images/ ディレクトリ以下で拡張子が .jpg または .png のファイルを検索する例です。

find /Applications/MAMP/htdocs/wdl/images -name "*.jpg" -o -name "*.png"  return

特定のディレクトリを除外 -prune

-prune オプションを指定すると、その前に指定された条件にマッチするディレクトリやファイルを辿らず検索しない(除外する)ようになります。

以下は ~/Documents 以下を検索する際に、backup を含む名前のディレクトリやファイルを除外して表示する例です。

find ~/Documents -name "*backup*" -prune -o -print  return

-o オプションは「または(条件をORで結ぶ)」という意味です。

-print オプションはデフォルトの出力の指定ですが、-prune オプションを使う場合は -o オプションと共に明示的に指定します。

-prune は、通常以下のように指定します。

条件1 -prune -o 条件2 -print

「条件1にマッチしたらそのディレクトリやファイルを辿らず、条件2にマッチしたら出力する」というような動作になります(条件2は省略可能)。

以下は ~/Documents 以下の backup を含む名前のディレクトリを除外したファイルの一覧を表示する例です。

find ~/Documents -type d -name "*backup*" -prune -o -type f -print  return

以下は、./test 以下のドットファイルを除き、3日以内に更新されたファイルを出力する例です。

find ./test -name ".*" -prune -o -type f -mtime -3 -print  return

ドットファイルは表示するが、ドットディレクトリの中は表示したくないという場合は以下のように「-type d」を追加します。

find ./test -name ".*" -type d -prune -o -type f -mtime -3 -print  return

検索結果を別のコマンドで処理 -exec

find コマンドは検索条件にアクション(オプション)を指定して、検索結果を別のコマンドに渡して実行することができます。

デフォルトではファイル名を表示する -print というアクションが実行されています。

-ls というアクションを指定するとファイルの詳しい情報(i-node 番号、サイズ、ファイルパーミッション、ハードリンク数、所有者名、グループ、サイズ、最終修正時刻、パス名)が表示されます。

find ./test -name "*.txt" -ls    return
3918711  0 -rw-r--r--    1 xxxx  staff  0  8 20 16:02 ./test/bar/find_sample.txt
3830016  8 -rw-r--r--    1 xxxx  staff 38  8 17 09:43 ./test/bar/sample_cat.txt
3918717  8 -rw-r--r--    1 xxxx  staff 21  8 20 16:03 ./test/bar/sample1.txt
3829988  8 -rw-r--r--    1 xxxx  staff 19  8 17 09:42 ./test/bar/sample2.txt

-exec アクションを使うと、検索結果(ファイルのパス)を別のコマンドの引数に渡して処理を実行することができます。

-exec アクションは以下のように記述することができます。

-exec コマンド [オプション] {} \;

  • {}(波括弧)の部分には検索結果(ファイルやディレクトリのパス)が入り、指定したコマンドの引数として渡されます。
  • 最後の ; はコマンドの終了を示しますが、コマンドラインではコマンドの区切りとして機能してしまうためバックスラッシュでエスケープして \; となっています。

例えば、検索結果を ls コマンドの -l オプションを指定して表示するには以下のようにします。

find ./test -name "*.txt" -exec ls -l {} \;    return
-rw-r--r--  1 xxxx  staff  0  8 20 16:02 ./test/bar/find_sample.txt
-rw-r--r--@ 1 xxxx  staff  38  8 17 09:43 ./test/bar/sample_cat.txt
-rw-r--r--@ 1 xxxx  staff  21  8 20 16:03 ./test/bar/sample1.txt
-rw-r--r--@ 1 xxxx  staff  19  8 17 09:42 ./test/bar/sample2.txt

※検索結果が多い場合は xargs コマンドを使うほうが速く処理ができます。

以下は ./test/bar ディレクトリ内のパーミッションが644のファイルを600に変更する例です。

find ./test/bar -perm 644 -type f -exec chmod 600 {} \;    return

変更や削除などの操作の場合は、コマンドを実行する際に1つずつ確認できる -ok アクションを使うと安心です。

検索結果を確認しながら別のコマンドで処理 -ok

検索結果を別のコマンドで処理する際に、渡される引数(検索結果)を1つずつ確認しながら実行するには -ok アクションを使います。

-ok アクションは以下のように記述することができます。

-ok コマンド [オプション] {} \;

以下は ./test/bar ディレクトリ内で名前に _old.txt が含まれるファイルを検索して、1つずつ確認しながら削除する例です。

find ./test/bar -name "*_old.txt" -ok rm {} \;    return
"rm ./test/bar/sample2_old.txt"? y   return  // y で削除
"rm ./test/bar/sample1_old.txt"? n   return  // n で削除しない

mdfind Spotlight 検索

macOS の Spotlight 検索をターミナルで使用するには mdfind コマンドを使います。

以下が書式です。

mdfind [-live] [-count] [-onlyin directory] [-name fileName | -s smartFolderName] キーワード

mdfind -h で書式やオプションを表示できます。

mdfind -h    return

Usage: mdfind [-live] [-count] [-onlyin directory] [-name fileName | -s smartFolderName | query]
list the files matching the query
query can be an expression or a sequence of words

  -attr <attr>      Fetches the value of the specified attribute
  -count            Query only reports matching items count
  -onlyin <dir>     Search only within given directory
  -live             Query should stay active
  -name <name>      Search on file name only
  -reprint          Reprint results on live update
  -s <name>         Show contents of smart folder <name>
  -0                Use NUL (``\0'') as a path separator, for use with xargs -0.

example:  mdfind image
example:  mdfind -onlyin ~ image
example:  mdfind -name stdlib.h
example:  mdfind "kMDItemAuthor == '*MyFavoriteAuthor*'"
example:  mdfind -live MyFavoriteAuthor

以下は「bashrc」と言うキーワードで検索する例です。

mdfind "bashrc"    return
/Applications/MAMP/htdocs/webdesignleaves/pr/plugins/mac_terminal_basics_01.html
/private/etc/bashrc
/Applications/Adobe Photoshop CC 2019/Presets/Scripts/ContactSheetII.jsx
/Users/xxxx/Creative Cloud Files/mac_terminal_basics.html
/Applications/MAMP/Library/share/man/man1/perlcygwin.1
/Applications/MAMP/Library/share/man/man1/perl5240delta.1
/Applications/MAMP/Library/share/man/man1/perldelta.1
/Applications/MAMP/Library/lib/perl5/5.24.0/pods/perlcygwin.pod
/Applications/MAMP/Library/lib/perl5/5.24.0/pods/perldelta.pod
/Applications/MAMP/Library/lib/perl5/5.24.0/pods/perl5240delta.pod
/Applications/MAMP/Library/lib/perl5/5.24.0/CPAN.pm
/Users/xxxx/Library/Application Support/Adobe/Dreamweaver CC 2019/ja_JP/Configuration/Updates/Core/Node/node_modules/dashdash/README.md
/Users/xxxx/Library/Application Support/Adobe/Dreamweaver CC 2019/ja_JP/Configuration/Updates/Core/Node/node_modules/dashdash/etc/dashdash.bash_completion.in
/Applications/Adobe Dreamweaver CC 2019/configuration/Updates/Core/Node/node_modules/dashdash/etc/dashdash.bash_completion.in
/Applications/Adobe Dreamweaver CC 2019/configuration/Updates/Core/Node/node_modules/dashdash/README.md
/private/etc/bashrc_Apple_Terminal

ファイル名を検索 -name

-name オプションを使うとファイル名またはディレクトリ名に指定した文字列が含まれるパスが表示されます。

mdfind -name "bashrc"    return
/private/etc/bashrc
/private/etc/bashrc_Apple_Terminal

特定のディレクトリ以下を検索 -onlyin

-onlyin オプションを指定すると、指定したディレクトリ以下を対象に検索します。

以下は ~/test ディレクトリ以下でキーワード sample で検索する例です。

mdfind -onlyin ~/test -name "sample"    return
/Users/xxxx/test/bar/sample1.txt
/Users/xxxx/test/bar/sample1_old.txt
/Users/xxxx/test/link_test/sample1.txt
/Users/xxxx/test/link_test/find_sample.txt
/Users/xxxx/test/link_test/sample_cat.txt
/Users/xxxx/test/link_test/sample2.txt

検索された数を表示 -count

-count オプションを指定すると条件にマッチした件数を表示します。

mdfind -count -onlyin ~/Documents/backup/htdocs/wdl/images/ "png"    return
56

xargs コマンドと使用

find コマンドの -exec オプションのような別のコマンドで処理するオプションはありませんが、xargs コマンドと組み合わせて使うことができます。

※スペースを含むファイル名に対応するには mdfind 及び xargs コマンドの両方に -0 オプションを指定する必要があります。

mdfind -onlyin ~/test -name "sample" -0 | xargs -0 ls -l
-rw-r--r--  1 xxxx  staff   0  8 21 09:31 /Users/xxxx/test/bar/sample1.txt
-rw-------  1 xxxx  staff   0  8 21 09:11 /Users/xxxx/test/bar/sample1_old.txt
-rw-r--r--  1 xxxx  staff   0  8 20 16:02 /Users/xxxx/test/link_test/find_sample.txt
-rw-r--r--@ 1 xxxx  staff  21  8 20 16:03 /Users/xxxx/test/link_test/sample1.txt
-rw-r--r--@ 1 xxxx  staff  19  8 17 09:42 /Users/xxxx/test/link_test/sample2.txt
-rw-r--r--@ 1 xxxx  staff  38  8 17 09:43 /Users/xxxx/test/link_test/sample_cat.txt

メタデータの表示 mdls コマンド

ファイルのメタデータを表示するには mdls コマンドを使います。

以下は写真のメタデータを表示する例です。

デジタルカメラで撮った写真の場合は、機種名や撮影時の情報、ピクセルサイズなだを確認できます。

mdls DSC00068.JPG    return
DSC00068.JPG: could not find DSC00068.JPG.  //ファイルが見つからないとのエラー

mdfind DSC00068.JPG    return  //mdfind でファイルの場所を確認
/Users/xxxx/Pictures/Sony RX100/2018/2018 NY/DSC00068.JPG

mdls /Users/xxxx/Pictures/Sony RX100/2018/2018 NY/DSC00068.JPG    return
/Users/xxxx/Pictures/Sony: could not find /Users/xxxx/Pictures/Sony.  //ファイルが見つからないとのエラー(指定したディレクトリにスペースが入っているため)

//ディレクトリ名のスペースをエスケープして実行
mdls /Users/xxxx/Pictures/Sony\ RX100/2018/2018\ NY/DSC00068.JPG    return
kMDItemAcquisitionMake             = "SONY"
kMDItemAcquisitionModel            = "DSC-RX100M6"
・・・
kMDItemFocalLength                 = 72
kMDItemFocalLength35mm             = 200
・・・
kMDItemFSSize                      = 7132324
・・・
kMDItemPhysicalSize                = 7135232
kMDItemPixelCount                  = 19961856
kMDItemPixelHeight                 = 3648
kMDItemPixelWidth                  = 5472
・・・

メタデータを指定して検索

mdfind コマンドではメタデータによる検索が可能です。

「属性名==文字列」 の形式で引用符で囲んで指定します。文字列にはワイルドカード * が使用できます。

以下は ~/ 以下でコンテンツに bootstrap4 が含まれるものを検索する例です。

mdfind -onlyin ~/ "kMDItemTextContent==*bootstrap4*"    return

を使って条件を加えることもできます。

mdfind -onlyin ~/ "kMDItemTextContent==*bootstrap4* && kMDItemDisplayName==*.html"    return

以下は /Applications/Utilities 以下の「アプリケーション」を検索する例です。

mdfind -onlyin /Applications/Utilities "kMDItemKind=='アプリケーション'"
/Applications/Utilities/Terminal.app
/Applications/Utilities/Console.app
/Applications/Utilities/Adobe Creative Cloud Experience/CCXProcess/CCXProcess.app
/Applications/Utilities/Adobe Sync/CoreSync/Core Sync.app
/Applications/Utilities/Script Editor.app
/Applications/Utilities/Activity Monitor.app
/Applications/Utilities/Migration Assistant.app
/Applications/Utilities/Boot Camp Assistant.app
/Applications/Utilities/System Information.app
/Applications/Utilities/Bluetooth File Exchange.app
/Applications/Utilities/VoiceOver Utility.app
/Applications/Utilities/ColorSync Utility.app
/Applications/Utilities/AirPort Utility.app
・・・

Spotlight Metadata Attributes

Spotlight のメタデータ属性の一覧は以下のページで確認できます。

File Metadata Attributes Reference/Spotlight Metadata Attributes

拡張属性

macOS の HFS+ ファイルシステムではアクセス権限(パーミッション)やサイズ、作成日時などの標準のファイル属性の他に、拡張属性(Extended Attributes/EA)と呼ばれる独自の属性を持っているファイルがあります。

ls コマンドに -l オプションを指定して実行した際に、パーミッションの横に @ が付いたファイルやディレクトリに拡張属性が設定されています。

ls -l   return
total 216
-rw-r--r--@ 1 xxxx  staff  94415  8  8 10:31 01.jpg  //拡張属性が設定されている
-rw-r--r--  1 xxxx  staff     19  8 17 09:41 sample1.txt
-rw-r--r--  1 xxxx  staff     19  8 17 09:42 sample2.txt
...

ls コマンドに -l@ オプションを指定して実行すると拡張属性のキーとサイズを表示することができます。

ls -l@
total 216
-rw-r--r--@ 1 xxxx  staff  94415  8  8 10:31 01.jpg
	com.apple.FinderInfo	   32   //拡張属性
	com.apple.metadata:_kMDItemUserTags	   42   //拡張属性
-rw-r--r--  1 xxxx  staff     19  8 17 09:41 sample1.txt
...

拡張属性には以下のようなものがあります。

  • com.apple.ResourceFork :ウィンドウやアイコンの状態、メニューの情報など(リソースフォーク)
  • com.apple.TextEncoding :エンコーディング情報
  • com.apple.FinderInfo :Finder のメタ情報
  • com.apple.metadata:_kMDItemUserTags :設定したタグのメタ情報
  • 等々

Windows にコピーされた場合の拡張属性

拡張属性は macOS の HFS+ ファイルシステムの独自の機能なので、Windows などの他のファイルシステムにコピーした場合は「._xxxx」と言う名前のドットファイルが作成されてそのファイルに拡張属性が保存されます。

以下は FAT32(MS-DOS)フォーマットの USB (/Volumes/myUSB/)の Test というディレクトリに拡張属性が付いた 01.jpg という画像ファイルをコピーする例です。

cp 01.jpg /Volumes/myUSB/Test/   return
          
ls -la /Volumes/myUSB/Test/   return
total 240
drwxrwxrwx  1 xxxx  staff   8192  8 17 13:13 .
drwxrwxrwx@ 1 xxxx  staff   8192  8 17 13:12 ..
-rwxrwxrwx  1 xxxx  staff   4096  8 17 13:13 ._01.jpg  //拡張属性が保存されたファイル
-rwxrwxrwx@ 1 xxxx  staff  94415  8 17 13:13 01.jpg  //コピーした画像ファイル

Windows ユーザには「._xxxx」と言う名前のドットファイルは不要なので、dot_clean コマンドを使って MS-DOS フォーマット上の指定されたディレクトリにある「._xxxx」ファイルをまとめて削除することができます。

以下は MS-DOS フォーマットの USB (/Volumes/myUSB/)の Test ディレクト内の「._xxxx」ファイルをまとめて削除する例です。

dot_clean /Volumes/myUSB/Test/   return
          
ls -la /Volumes/myUSB/Test/   return //._01.jpg が削除された
total 224
drwxrwxrwx  1 xxxx  staff   8192  8 17 13:29 .
drwxrwxrwx@ 1 xxxx  staff   8192  8 17 13:12 ..
-rwxrwxrwx  1 xxxx  staff  94415  8 17 13:13 01.jpg

xattr 拡張属性の操作

拡張属性を持つファイルの操作は macOS 独自コマンドの xattr コマンドを使います。

xattr [オプション] ファイル名

オプションを指定せずに xattr コマンドを実行すると、指定したファイルに設定されている拡張属性を一覧表示します。

xattr 01.jpg    return
com.apple.FinderInfo
com.apple.metadata:_kMDItemUserTags

-l オプションを指定すると、16進数と ASCII 表示による拡張属性の内容が表示されます。

xattr -l 01.jpg     return
com.apple.FinderInfo:
00000000  4A 50 45 47 38 42 49 4D 00 00 00 00 00 00 00 00  |JPEG8BIM........|
00000010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
00000020
com.apple.metadata:_kMDItemUserTags:
00000000  62 70 6C 69 73 74 30 30 A0 08 00 00 00 00 00 00  |bplist00........|
00000010  01 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00 00 09                    |..........|
0000002a

拡張属性の削除

-d オプションを使うと指定した拡張属性を削除することができます。

xattr -d 拡張属性名 ファイル名

xattr sample1.txt     return  //拡張属性の表示
com.apple.FinderInfo
com.apple.lastuseddate#PS
com.apple.metadata:_kMDItemUserTags

xattr -d com.apple.lastuseddate#PS sample1.txt     return  //拡張属性の削除

xattr sample1.txt     return
com.apple.FinderInfo
com.apple.metadata:_kMDItemUserTags

-c オプションを使うと全ての拡張属性を削除することができます。

xattr -c ファイル名 ...

xattr -c sample1.txt     return  //全ての拡張属性の削除

拡張属性は macOS ユーザ以外では不要なので、Windows ユーザにファイルを渡す場合などは拡張属性を削除した方が良いかもしれません。

open アプリを開く

macOS 独自の open コマンドを使うと、ターミナル上からファイルやフォルダ、アプリケーションを開くことができます。

open [オプション] ファイル名

オプションなしでファイル名(ファイルのパス)を指定して実行すると、デフォルトのアプリケーション(LaunchServices に登録されているアプリケーション)が起動してファイルが開かれます。

例えば拡張子が .jpg の画像ファイルを指定すると「プレビュー(Preview.app)」が起動して画像ファイルが表示されます。Finder でファイルをダブルクリックしたのと同じような動作をします。

open 01.jpg    return

ディレクトリを Finder で表示させるには、以下のようにディレクトリのパスを指定します。

open /Applications/MAMP

現在いるディレクトリを Finder で表示させるには、以下のようにカレントディレクトリを表す「.」を指定します。

open .    return

URL を指定するとデフォルトのブラウザで指定したサイトを開きます。

open http://webdesignleaves.com

-e オプションを指定するとテキストエディット(/Applications/TextEdit)でファイルを開きます。

デフォルトのテキストエディタがテキストエディットになっていれば -e オプションを指定しなくても同じことになります。

open -e sample1.txt   return //TextEdit で sample1.txt を開く
          
open sample1.txt   return //おそらく同じこと

-a アプリケーションを指定して開く

-a オプションを使ってアプリケーションを指定してファイルを開くこともできます。

アプリケーション名にスペース(特殊文字)が入っている場合はバックスラッシュでエスケープします。

open -a Safari 01.jpg   return //Safari で 01.jpg を開く
          
open -a Microsoft\ Word sample1.txt   return //Word で sample1.txt を開く

open -a Adobe\ Photoshop\ CC\ 2019 01.jpg   return //Photoshop で 01.jpg を開く

テキストファイルの基本的な操作

sort 並べ替え

テキストファイルを行単位で並べ替えるには sort コマンドを使います。

以下が書式です。

sort [オプション] [ファイル1 ファイル2 ...]

以下のようなオプションがあります。

オプション 意味
-c 並べ替えられているかどうかをチェックする。ソートされていない場合は、エラーメッセージを表示して終了。
-m 並べ替えられたファイルをマージする(並べ替えは行わない)
-o output(ファイル名) 結果を出力するファイル名を指定する(デフォルトは標準出力)
-u 同一の内容の行は最初の行だけを出力(重複している行を出力しない)
-b 先頭の空白を無視して並べ替え
-d データが空白と英数字のみと仮定して並べ替え
-f 大文字・小文字を区別しないで並べ替え
-g 一般的な数値として並べ替え
-h 人が認識する形式(k や M などの単位等を考慮した)の数値で並べ替え
-i 表示可能な文字だけを対象に並べ替え
-M 月名(Jan, Feb など)で並べ替え。不明な値は小さいと判定。
-n 数値と見なして並べ替え
-r 逆順で並べ替え
-k field(フィールド番号) 指定したフィールド番号を対象に並べ替え。-k オプションは複数指定可能です(最初に指定したフィールドの値が同じ場合に、次の指定が比較されます)。
-t char(区切り文字) フィールドの区切り文字を指定する(デフォルトは空白文字)
-z NULL 文字をレコードの区切りとして使用

以下は単純な並べ替えの例です。

cat sort_sample1.txt   return  //対象のファイルの確認
banana
2M
grape
1234
apple
321
orange
1k

sort sort_sample1.txt    return  //オプションなしで並べ替え
1234
1k
2M
321
apple
banana
grape
orange

sort -r sort_sample1.txt    return  //逆順で(-r)並べ替え
orange
grape
banana
apple
321
2M
1k
1234

sort -n sort_sample1.txt    return  //数値と見なして(-n)並べ替え 
apple
banana
grape
orange
1k
2M
321
1234

sort -h sort_sample1.txt    return  //単位などを考慮して(-h)並べ替
apple
banana
grape
orange
321
1234
1k
2M

以下は2つのファイルを合わせて並べ替える例です。

sort コマンドは複数のファイルを引数に指定することができます。

cat sort_sample1.txt   return  //対象のファイルの確認
banana
2M
grape
1234
apple
321
orange
1k

cat sort_sample2.txt   return  //対象のファイルの確認
Papaya
Watermelon
Mango

sort -f sort_sample1.txt sort_sample2.txt   return  
//大文字と小文字を区別せず(-f)に2つのファイルを並べ替え
1234
1k
2M
321
apple
banana
grape
Mango
orange
Papaya
Watermelon

フィールドを指定して並べ替え

デフォルトでは各行の並べ替えは先頭を比較しますが、-k オプションを使うと、並べ替えに使用する「フィールド」を指定できます。

以下のようなタブ区切りのテキストファイル(sort_sample3.txt)を例にします。

cat sort_sample3.txt   return //ファイルの内容 
Grape	789	Purple
Banana	123	Yellow
Melon	654	Green
Apple	345	Red
Orange	123	Orange

sort sort_sample3.txt   return //フィールドを指定せずに並べ替え
Apple	345	Red
Banana	123	Yellow
Grape	789	Purple
Melon	654	Green
Orange	123	Orange

-k オプションを指定することで指定したフィールドから行末が比較されます。

sort_sample3.txt の2番目のフィールド(数値)以降で並べ替えるには、以下のように指定します。

sort -k 2 sort_sample3.txt    return 
Orange	123	Orange
Banana	123	Yellow
Apple	345	Red
Melon	654	Green
Grape	789	Purple

オプションで「-k 最初のフィールド番号, 最後のフィールド番号」のように指定してフィールドを限定することができます。

前述の例は2番目のフィールド以降を対象に比較して並べ替えられましたが、以下の例では2番目のフィールドのみを比較して並べ替えています。

そのため、フィールドの値が同じ123の場合の順番が前述の例と異なります。

sort -k 2,2 sort_sample3.txt    return 
Banana	123	Yellow
Orange	123	Orange
Apple	345	Red
Melon	654	Green
Grape	789	Purple

複数の -k オプションの指定

-k オプションは複数指定可能で、最初に指定したフィールドの値が同じ場合に、次に指定したフィールドの値が比較されます。

並べ替えの対象のファイルは前述の例と同じ sort_sample3.txt を使用します。

cat sort_sample3.txt     return 
Grape	789	Purple
Banana	123	Yellow
Melon	654	Green
Apple	345	Red
Orange	123	Orange

2番めのフィールドを指定して数値(-n)として並べ替えると以下のようになります。

sort -k 2n sort_sample3.txt     return 
Banana	123	Yellow
Orange	123	Orange
Apple	345	Red
Melon	654	Green
Grape	789	Purple

//この場合以下でも同じ結果
sort -n -k 2 sort_sample3.txt     return 
Banana	123	Yellow
Orange	123	Orange
Apple	345	Red
Melon	654	Green
Grape	789	Purple

//-n を指定しない場合、2番めのフィールドの値が同じ場合の並び順が異なる
sort -k 2 sort_sample3.txt     return 
Orange	123	Orange
Banana	123	Yellow
Apple	345	Red
Melon	654	Green
Grape	789	Purple

2番めのフィールドの値が同じ場合に、3番めの値を比較して並び替えるようにするには以下のように指定できます。

sort -k 2n -k 3 sort_sample3.txt     return 
Orange	123	Orange
Banana	123	Yellow
Apple	345	Red
Melon	654	Green
Grape	789	Purple

2番めのフィールドの値が同じ場合に、3番めの値を比較して逆順(-r)に並び替えるようにするには以下のように指定できます

sort -k 2n -k 3r sort_sample3.txt     return 
Banana	123	Yellow
Orange	123	Orange
Apple	345	Red
Melon	654	Green
Grape	789	Purple

CSVデータを並べ替え

-k オプションは、デフォルトでは空白文字を区切りとして並べ替えに使うフィールドを指定します。

区切り文字を変更する場合は、-t オプションで使用する文字を指定します。

例えば、CSV(comma separated values)データ(ファイル)の場合は区切り文字は「,」なので「-t ,」または「-t ","」のように指定します。

以下は5つのフィールド(姓 名 性別 生年月日 年齢)からなる CSV ファイルの例です。

cat sample.csv    return 
Saegusa,Hisashi,Male,19960724,63
Takashima,Teruko,Female,19950831,23
Mimura,Saya,Female,19660905,18
Itou,Morihiro,Male,19770209,42
Nakanishi,Ryouichi,Male,19950212,23
Kawana,Mai,Female,19800517,39

以下は、カンマ区切りのデータ(CSV ファイル)の3番目のフィールド以降行末までの値を対象に並べ替える例です。

sort -k 3 -t "," sample.csv    return 
Mimura,Saya,Female,19660905,18
Kawana,Mai,Female,19800517,39
Takashima,Teruko,Female,19950831,23
Itou,Morihiro,Male,19770209,42
Nakanishi,Ryouichi,Male,19950212,23
Saegusa,Hisashi,Male,19960724,63

5番目のフィールドを数値の小さい順に並べ替えるには -n オプションを指定します。

sort -n -k 5 -t "," sample.csv    return 
Mimura,Saya,Female,19660905,18
Nakanishi,Ryouichi,Male,19950212,23
Takashima,Teruko,Female,19950831,23
Kawana,Mai,Female,19800517,39
Itou,Morihiro,Male,19770209,42
Saegusa,Hisashi,Male,19960724,63

//または以下のように指定することもできます。
sort -k 5n -t "," sample.csv    return 
Mimura,Saya,Female,19660905,18
Nakanishi,Ryouichi,Male,19950212,23
Takashima,Teruko,Female,19950831,23
Kawana,Mai,Female,19800517,39
Itou,Morihiro,Male,19770209,42
Saegusa,Hisashi,Male,19960724,63

以下は、5番目のフィールドを数値の大きい順(逆順 -r)に並べ替える例です。

以下の例では、フィールドの値が同じ23の場合の並び順が異なります。(複数の -k オプションの指定

sort -nr -k 5 -t "," sample.csv     return 
Saegusa,Hisashi,Male,19960724,63
Itou,Morihiro,Male,19770209,42
Kawana,Mai,Female,19800517,39
Takashima,Teruko,Female,19950831,23
Nakanishi,Ryouichi,Male,19950212,23
Mimura,Saya,Female,19660905,18

//または以下のように指定することもできますが、フィールドの値が同じ23の場合の並び順が異なります。
sort -k 5nr -t "," sample.csv    return 
Saegusa,Hisashi,Male,19960724,63
Itou,Morihiro,Male,19770209,42
Kawana,Mai,Female,19800517,39
Nakanishi,Ryouichi,Male,19950212,23
Takashima,Teruko,Female,19950831,23
Mimura,Saya,Female,19660905,18

//以下のように -k オプションを4番目のフィールドに指定したのと同じになっています。
sort -k 5nr -k 4n -t "," sample.csv    return 
Saegusa,Hisashi,Male,19960724,63
Itou,Morihiro,Male,19770209,42
Kawana,Mai,Female,19800517,39
Nakanishi,Ryouichi,Male,19950212,23
Takashima,Teruko,Female,19950831,23
Mimura,Saya,Female,19660905,18

//以下のように指定すると最初の例と同じ結果になります。
sort -k 5nr -k 4nr -t "," sample.csv    return 
Saegusa,Hisashi,Male,19960724,63
Itou,Morihiro,Male,19770209,42
Kawana,Mai,Female,19800517,39
Takashima,Teruko,Female,19950831,23
Nakanishi,Ryouichi,Male,19950212,23
Mimura,Saya,Female,19660905,18

重複している行を表示しない

sort コマンドに -u オプションを指定して実行すると、並び替え後に重複している行を取り除く(重複している行を表示しない)ことができます。

uniq コマンドを使う際にソートする必要がある場合は、こちらを使うほうが簡単かもしれません。

以下は、都市名が記述された sample.txt というファイルをソートして重複した行を取り除いて表示する例です。

cat sample.txt   return //ファイルの内容
Tokyo
Paris
New York
Rio De Janeiro
Los Angels
Paris
New York
Tokyo
Los Angels
Los Angels
Rio De Janeiro
New York

sort -u sample.txt    return //並び替えて重複行を削除
Los Angels
New York
Paris
Rio De Janeiro
Tokyo

uniq 重複行の削除

テキストファイルの重複している行を取り除くには uniq コマンドを使います。

但し、uniq コマンドは隣接している行を比較するため、隣接する重複行しか削除できません。

そのため必要に応じて元のテキストを sort コマンドを使って並べ替えておく必要があります。

以下が書式です。

uniq [オプション] 入力ファイル [出力ファイル]

以下は主なオプションです。

オプション 意味
-c 各行の前に出現(重複)回数を出力
-d 重複した行だけを出力
-i 比較時に大文字と小文字の違いを無視
-u 重複していない行だけを出力

重複している行を削除

以下のようなソートされていないファイルから重複している行を削除するには、予め sort コマンドでソートした結果をパイプ(|)で uniq コマンドに渡します。

この場合は、sort コマンドの -u オプションを使うほうが簡単です。

cat sample.txt   return //ファイルの内容
Tokyo
Paris
New York
Rio De Janeiro
Los Angels
Paris
New York
Tokyo
Los Angels
Los Angels
Rio De Janeiro
New York
                
sort sample.txt | uniq    return //sort で並び替えてから重複行を削除
Los Angels
New York
Paris
Rio De Janeiro
Tokyo

sort -u sample.txt    return //sort コマンドの -u オプションを実行
Los Angels
New York
Paris
Rio De Janeiro
Tokyo

大文字・小文字を区別しない

デフォルトでは大文字・小文字は区別されます。

-i オプションを使うと、大文字・小文字を区別しないで重複する行を削除することができますが、uniq コマンドは隣接している行を比較するため、sort コマンドで並べ替える際に -f オプションを使って大文字・小文字を区別しないでソートしておく必要があります。

この場合も、sort コマンドの -u オプション(及び -f オプション)を使うほうが簡単です。

cat sample2.txt    return //ファイルの内容
Tokyo
Paris
New York
Rio De Janeiro
Los Angels
new york
tokyo
Paris
New York
Tokyo
Los Angels
Los Angels
Rio De Janeiro
los angels
paris
new york

sort -f sample2.txt     return //大文字・小文字を区別せずにソートした場合
Los Angels
Los Angels
Los Angels
los angels
New York
New York
new york
new york
Paris
Paris
paris
Rio De Janeiro
Rio De Janeiro
Tokyo
Tokyo
tokyo

//大文字・小文字を区別せずにソートして -i オプションで大文字・小文字を区別せずに重複行を削除
sort -f sample2.txt |uniq -i   return 
Los Angels
New York
Paris
Rio De Janeiro
Tokyo

sort -fu sample2.txt     return //sort コマンドの -u 及び -f オプションを実行
Los Angels
New York
Paris
Rio De Janeiro
Tokyo

重複行だけを表示

-d オプションを使うと重複した行だけを出力することができます。

uniq コマンドは隣接している行を比較するため、並べ替えが必要な場合は sort コマンドと組み合わせて使います。

cat sample3.txt     return //ファイルの内容
Tokyo
Paris
New York
Rio De Janeiro
Los Angels
Paris
Osaka
Kyoto

sort sample3.txt | uniq -d    return //ソート後に重複行だけを表示
Paris

重複回数を表示

-c オプションを指定すると、重複している行をカウントして重複回数を表示します。

並べ替えが必要な場合は sort コマンドと組み合わせて使います。

cat sample2.txt     return //ファイルの内容
Tokyo
Paris
New York
Rio De Janeiro
Los Angels
new york
tokyo
Paris
New York
Tokyo
Los Angels
Los Angels
Rio De Janeiro
los angels
paris
new york
   
sort sample2.txt | uniq -c   return //ソート後に重複回数を表示
   3 Los Angels
   2 New York
   2 Paris
   2 Rio De Janeiro
   2 Tokyo
   1 los angels
   2 new york
   1 paris
   1 tokyo

//大文字小文字を区別せずソートして、大文字小文字を区別せずに重複回数を表示
sort -f sample2.txt | uniq -ci   return 
   4 Los Angels
   4 New York
   3 Paris
   2 Rio De Janeiro
   3 Tokyo

以下は sort -f を使って大文字小文字を区別せずにソート後、uniq -ci で大文字小文字を区別せずに重複回数をカウントし、回数の多い順に表示する例です。

sort -f sample2.txt | uniq -ci | sort -nr
   4 New York
   4 Los Angels
   3 Tokyo
   3 Paris
   2 Rio De Janeiro

tr 文字の置換・削除

tr コマンドを使うと指定した文字を置換したり削除することができます。

以下が書式です。

tr [オプション] 文字セット1 [文字セット2]

※ tr コマンドは標準入力が使われるので、引数にファイルを指定することができません。

そのためファイルを処理したい場合は cat コマンドなどとパイプを使うか、リダイレクト(<)を使ってファイルから読み込む必要があります。

cat ファイル | tr [オプション] 文字セット1 [文字セット2]

tr [オプション] 文字セット1 [文字セット2] < ファイル

以下は主なオプションです。

オプション 意味
-d 「文字セット1」に含まれる文字を削除
-s 「文字セット1」に含まれる文字が連続していたら、それらを1つにまとめる

以下は「,」を「:」に置換及び「"」を「'」に置換する例です(cat コマンドとパイプを利用)。

引用符や特殊文字を指定する場合は、バックスラッシュでエスケープするか引用符で囲む必要があります。

cat tr_sample.txt   return //ファイルの内容
abc,def,ghi
"ABC", "DEF", "GHI"

cat tr_sample.txt | tr , :    return //「,」を「:」に置換
abc:def:ghi
"ABC": "DEF": "GHI"

cat tr_sample.txt | tr \" \'   return //「"」を「'」に置換
abc,def,ghi
'ABC', 'DEF', 'GHI'

cat tr_sample.txt | tr '"' "'"   return //「"」を「'」に置換
abc,def,ghi
'ABC', 'DEF', 'GHI'

cat tr_sample.txt | tr ,\" :\'   return //両方まとめて一度に置換
abc:def:ghi
'ABC': 'DEF': 'GHI'

複数の文字を置換

tr abc 123 を実行すると「a」を「0」に、「b」を「2」に、「c」を「3」に置き換えます。

「abc」という連続した文字列を「123」に置き換えるのではなく、1文字対1文字での置き換えになります。

cat tr_sample2.txt   return //ファイルの内容
abc abc abc
aaa bbb ccc 

//以下ではリダイレクト(<)でファイル tr_sample2.txt を読み込んでいます
tr abc 123 < tr_sample2.txt    return aを1、bを2、cを3に置換
123 123 123
111 222 333 

「文字セット1」と「文字セット2」の長さが同じであれば、1文字対1文字での置き換えになりますが、「文字セット2」の文字数が少ない場合は「文字セット2」の最後の文字に置換されます。

tr 文字セット1 文字セット2

これを利用すると複数の文字を特定の文字に置換することができます。

例えば、「a」「b」「c」を「3」に置換するには以下のようにします。

cat tr_sample2.txt   return //ファイルの内容
abc abc abc
aaa bbb ccc 

tr abc 3 < tr_sample2.txt     return「a」「b」「c」を「3」に置換
333 333 333
333 333 333

大文字・小文字を変換

引数を「文字1-文字2」のようにハイフンでつなげて文字の範囲を指定することができます。

以下のように tr a-z A-Z を実行すると、小文字を大文字に変換することができます。

cat tr_sample2.txt   return //ファイルの内容
abc abc abc
aaa bbb ccc 

cat tr_sample2.txt | tr a-z A-Z  return //小文字を大文字に変換
ABC ABC ABC
AAA BBB CCC

文字を削除 -d

-d オプションを使うと、指定した文字を削除することができます。

以下はスペースを削除する例です。

cat tr_sample2.txt   return //ファイルの内容
abc abc abc
aaa bbb ccc 

cat tr_sample2.txt | tr -d " "   return //スペースを削除
abcabcabc
aaabbbccc

連続した文字や改行を1つにする -s

-s オプションを使うと、指定した文字が連続している場合にそれらを1つにまとめることができます。

cat tr_sample2.txt   return //ファイルの内容
abc abc abc
aaa bbb ccc 

cat tr_sample2.txt | tr -s "abc"   return //「a」「b」「c」をそれぞれ1つにまとめる
abc abc abc
a b c 

「改行」は「\n」で表すことができるので、連続した改行を1つにまとめるには以下のようにします。

cat tr_sample3.txt   return //ファイルの内容
abc

def

ghi

cat tr_sample3.txt | tr -s "\n"   return //改行を1つにまとめる
abc
def
ghi

wc 文字数や行数を数える

wc コマンドはテキストファイルの行数や単語数(空白や改行文字で区切られたもの)、文字数、バイト数を数えるコマンドです。

以下が書式です。

wc [オプション] [ファイルのパス]

以下は wc コマンドの主なオプションです。

オプション 意味
-c バイト数のみを表示
-l 改行の数(行数)のみを表示
-m 文字数のみを表示
-w 単語数のみを表示

デフォルトでは「行数」「単語数」「バイト数」が表示されます。

wc process.txt   return
       3      12      91 process.txt
      行数   単語数   バイト数
       
cat process.txt   return
  PID TTY           TIME CMD
 6045 ttys000    0:00.00 -bash
32387 ttys000    0:01.27 -bash

以下はワイルドカードを使って複数のファイルを指定した例です。複数のファイルを指定すると、合計(total)が表示されます。

wc *.txt
      12     108     753 01.txt
      10      24     417 personal_info.txt
       3      12      91 process.txt
     290    5100   59199 system_log.txt
     315    5244   60460 total  //合計

文字数を数える

文字数を数える場合は -m オプションを使用します。

単語数も一緒に表示する場合は -w オプションを、行数も一緒に表示する場合は -l オプションを同時に指定します。

wc -m process.txt    return //文字数(-m)を表示
      91 process.txt
      
wc -mw process.txt     return //単語数(-w)と文字数(-m)を表示
      12      91 process.txt
      
wc -mwl process.txt     return //行数(-l)、単語数(-w)、文字数(-m)を表示
       3      12      91 process.txt

個別に行数(-l)、単語数(-w)、文字数(-m)、バイト数(-c)を表示するには、それぞれのオプションを個別に指定します。

wc -l process.txt    return //行数
       3 process.txt
       
wc -w process.txt    return //単語数
      12 process.txt
      
wc -c process.txt    return //バイト数
      91 process.txt

以下は、ls コマンドと grep コマンドで拡張子が .txt のファイルを1行ずつ表示して、wc コマンドと組み合わせてファイル数を数える例です。ls コマンドのオプション -1 は数字の1で、1ファイル1行で出力するオプションです。

ls -1 | grep ".txt" | wc -l    return
       5

以下は find コマンドを使って前述と同様のことを実行する例です。

find . -maxdepth 1 -type f | grep ".txt" |wc -l
       5

grep テキストファイルの検索

grep コマンドは、テキストファイルから指定した文字列を含む行を検索するコマンドです。

デフォルトでは指定した文字列と一致する部分が見つかった行を表示します。

以下が書式で、最初の引数に検索する文字列を、次の引数にファイルのパスを指定します。

検索文字列には正規表現を指定することも可能です。

grep [オプション] 検索文字列 ファイル名

以下が主なオプションです。

オプション 意味
-A num(行数) 一致した行の後の行(num で指定した行数)も表示
-B num(行数) 一致した行の前の行(num で指定した行数)も表示
-C num(行数) 一致した行の前後の行(num で指定した行数)も表示
-c マッチした行数のみを表示
-e pattern(検索文字列) 複数の検索文字列(パターン)を指定する場合に指定
-E 検索に拡張正規表現を使う
-f file(読み込むファイル) 検索する文字列(パターン)を指定したファイル(file)から読み込む
-i 大文字と小文字の区別をしない
-n マッチした行のファイル内での行番号を表示
-r サブディレクトリを含めて再帰的に検索
-v マッチしなかった行を表示
-w 単語全体でパターンと一致するものを検索
-x 行全体とマッチする行のみを表示

以下の例では次のような personal_info.txt という「氏名,性別,生年月日,年齢,血液型」がカンマ区切りで記載されいるテキストファイルを例に使います。

cat personal_info.txt     return
玉井 泰智,男,1998年09月09日,20,B
佐々木 誠子,女,1972年10月08日,46,A
三沢 成光,男,1978年07月21日,41,B
坪井 麻里,女,1963年04月20日,56,A
内田 琴乃,女,1991年02月17日,28,A
太田 朱里,女,1993年05月14日,26,AB
梶 穂高,男,1998年12月12日,20,O
浜田 均,男,1963年09月19日,55,O
森下 絢子,女,1986年09月23日,32,A
岸田 大瑚,男,1987年10月31日,31,A

以下は personal_info.txt から「AB」という文字列を含む行を表示する例です。この場合、検索文字列は引用符で囲んでも、囲まなくても同じです。

grep AB personal_info.txt    return
太田 朱里,女,1993年05月14日,26,AB

grep 'AB' personal_info.txt   return
太田 朱里,女,1993年05月14日,26,AB

$ grep "AB" personal_info.txt   return
太田 朱里,女,1993年05月14日,26,AB

検索文字列にスペースや特殊文字を含む場合は、引用符で囲むかバックスラッシュでエスケープする必要があります。

grep "森下 絢" personal_info.txt    return
森下 絢子,女,1986年09月23日,32,A

grep 森下\ 絢 personal_info.txt   return
森下 絢子,女,1986年09月23日,32,A

単語単位で検索

以下は B という文字を含む行を表示する例です。

grep B personal_info.txt    return
玉井 泰智,男,1998年09月09日,20,B
三沢 成光,男,1978年07月21日,41,B
太田 朱里,女,1993年05月14日,26,AB

上記の場合、AB もマッチしますが、B のみにマッチさせるようにするには -w オプションを指定して B という単語のみを検索対象にします(この例の場合、B は1文字で単語とは言えませんが、例えば log と blog を区別する場合など)。

grep -w B personal_info.txt    return
玉井 泰智,男,1998年09月09日,20,B
三沢 成光,男,1978年07月21日,41,B

行番号付きで表示

行番号付きで表示するには -n オプションを指定します。

grep -n 1998 personal_info.txt 
1:玉井 泰智,男,1998年09月09日,20,B
7:梶 穂高,男,1998年12月12日,20,O

前後の行も表示

該当する行の前後の行を表示させるには、-B(前の行)、-A(後の行)、-C(前後の行)のオプションを指定することができます。

または、前後2行ずつ表示したい場合は、「-2」のように数字で指定することができます。

grep -B 2 "AB" personal_info.txt     return //前の2行を表示
坪井 麻里,女,1963年04月20日,56,A
内田 琴乃,女,1991年02月17日,28,A
太田 朱里,女,1993年05月14日,26,AB

grep -A 2 "AB" personal_info.txt     return //後の2行を表示
太田 朱里,女,1993年05月14日,26,AB
梶 穂高,男,1998年12月12日,20,O
浜田 均,男,1963年09月19日,55,O

grep -C 2 "AB" personal_info.txt     return //前後の2行を表示
坪井 麻里,女,1963年04月20日,56,A
内田 琴乃,女,1991年02月17日,28,A
太田 朱里,女,1993年05月14日,26,AB
梶 穂高,男,1998年12月12日,20,O
浜田 均,男,1963年09月19日,55,O

grep -2 "AB" personal_info.txt     return //前後の2行を表示
坪井 麻里,女,1963年04月20日,56,A
内田 琴乃,女,1991年02月17日,28,A
太田 朱里,女,1993年05月14日,26,AB
梶 穂高,男,1998年12月12日,20,O
浜田 均,男,1963年09月19日,55,O

行数のみを表示(数を調べる)

-c オプションを指定するとマッチした行数のみを表示します。

以下は「,男」がマッチした数を調べる例です。

grep -c ',男' personal_info.txt    return
5

文字列を含まない行を表示

「~を含まない行」だけを表示する場合は -v オプションを使います。

以下は「A」を含まない行を表示する例です。

grep -v 'A' personal_info.txt    return
玉井 泰智,男,1998年09月09日,20,B
三沢 成光,男,1978年07月21日,41,B
梶 穂高,男,1998年12月12日,20,O
浜田 均,男,1963年09月19日,55,O

複数の検索文字を検索(OR検索) -e

「xxxx または yyyy を含む行を検索」のように複数の文字列を検索する場合は、-e オプションを付けてそれらが「検索文字列」であることを明示する必要があります(2つ目以降が検索対象のファイルやディレクトリの指定と解釈されないようにするため)。

grep -e '1991' -e '1993' personal_info.txt    return
内田 琴乃,女,1991年02月17日,28,A
太田 朱里,女,1993年05月14日,26,AB

大小文字を区別しない -i オプションと併用する場合は以下のように指定します。この場合、-i オプションはコマンド全体に有効なので、文字列1、文字列2ともに大小文字が区別されなくなります。

grep -i -e 文字列1 -e 文字列2 ファイル名

複数の検索文字を検索(OR検索) 正規表現

複数の文字列を検索する場合、正規表現で「または」という意味の「|」を使って指定することもできます。

拡張正規表現として -E オプションを指定するか、「|」の前にバックスラッシュ「\」を付けて「\|」のようにエスケープします。検索文字に特殊文字を含むので、全体を引用符(")で囲みます。

grep -E "1991|1993" personal_info.txt    return
内田 琴乃,女,1991年02月17日,28,A
太田 朱里,女,1993年05月14日,26,AB

$ grep "1991\|1993" personal_info.txt    return
内田 琴乃,女,1991年02月17日,28,A
太田 朱里,女,1993年05月14日,26,AB

複数の検索文字を検索(AND検索)

「どちらの検索文字列も含む行」という条件で検索する場合は、検索結果をパイプを使ってさらに grep コマンドを実行します。

以下は、文字列「196」と文字列「A」が両方含まれる行を取得します。

grep '196' personal_info.txt | grep 'A'   return
坪井 麻里,女,1963年04月20日,56,A

検索文字列をファイルから読み込む

検索文字列のリストのファイルがある場合は -f オプションを使ってファイルを指定して検索文字列のリストを読み込むことができます。

以下は検索文字列のリスト serch_list.txt を読み込んで、personal_info.txt を検索する例です。

cat serch_list.txt   return  //検索文字列のリストを確認
1963
男

test $ grep -f serch_list.txt personal_info.txt   return
//リストに記載されている「1963」または「男」を含む行が表示される
玉井 泰智,男,1998年09月09日,20,B    
三沢 成光,男,1978年07月21日,41,B
坪井 麻里,女,1963年04月20日,56,A
梶 穂高,男,1998年12月12日,20,O
浜田 均,男,1963年09月19日,55,O
岸田 大瑚,男,1987年10月31日,31,A
grep で使える正規表現

正規表現には幾つかの種類があり、grep コマンドはデフォルトでは(オプションを付けない場合は)基本正規表現(BRE)を使用することができます。

-E オプションを指定することで、拡張正規表現(ERE)を使用できます。

正規表現のパターンを確認するには、以下のようにパイプを使って echo コマンドと grep コマンドをつなげると便利です。

以下は echo で送った「abc 123」と「数値以外で始まり1つの空白文字に続いて英字の小文字以外で終わる」というようなパターンがマッチするかを確認する例です。

echo "abc 123" | grep "^[^0-9]*\s[^a-z]*$"   return
abc 123  //マッチすると表示される

基本正規表現(BRE)

以下は grep コマンドで使える主な基本正規表現(BRE)です。

メタ文字 意味
^ 行の先頭。(例)^abc:abcから始まる行
$ 行の終わり。(例)abc$:abcで終わる行。^$:空行
. 改行以外の任意の文字
* 直前文字の0回以上の繰り返し
[...] [ ]で囲まれている文字のいずれか。(例) [abc123]:abc123のどれか
[^...] [ ]で囲まれている文字以外。(例)[^abc123]:abc123以外
[n-n] 指定範囲(n-n)のいずれかの文字。(例)[a-c]:abcのどれか。 [1-3]:123のどれか
\< 単語の始まり。(例)\<abc:abcで始まる単語。
\> 単語の終わり。(例)abc\>:abcで終わる単語。\<abc\>:abcという単語
\b 単語の区切り(単語境界)。(例)\bABC\b:ABCという単語
\s 任意の空白文字
\S 空白文字以外の文字
\w 任意の単語。[a-zA-Z0-9]と同じ
\W 単語文字以外の文字。[^a-zA-Z0-9]と同じ

※検索文字列の中にメタ文字(特殊文字)と同じ文字を使う場合は、バックスラッシュ(\)を付けてエスケープする必要があります。例えば、\s という文字列を探す場合は \\s とします。

拡張正規表現(ERE)

以下は grep コマンドで使える主な拡張正規表現(ERE)です。

使用する場合は -E オプションを指定するか、それぞれのメタ文字をバックスラッシュ(\)でエスケープします。

echo "aabc11123" | grep -E "a+.*1{3}"  return
aabc11123

echo "aabc11123" | grep "a\+.*1\{3\}"  return
aabc11123
メタ文字 意味
? 直前の項目の0回または、1回だけの繰り返し。{0,1}と同じ
+ 直前の項目の1回以上の繰り返し。{1,}と同じ。
{n} 直前の項目の n 回の繰り返し。(例) [0-9]{3}:3桁の数値
{n,} 直前の項目の n 回以上の繰り返し。(例)[0-9]{5,}:5桁以上の数値
{,m} 直前の項目の m 回以下の繰り返し。(例)[0-9]{,7}:7桁以下の数値
{n,m} 直前の項目の n 回から m 回の繰り返し。(例)[0-9]{5,8}:5桁から8桁の数値
| または(OR)。(例)jpg|png:jpg または png
() グループ化。複数の項目をまとめ、* , + , ? , | 等の対象とします。(例)(abc){2}:abcabc

リダイレクトとパイプ

リダイレクトやパイプを使うと、コマンドの出力をファイルに保存したり別のコマンドに渡したりすることができます。

例えば、dmesg コマンドは起動時のシステムのメッセージのバッファを表示するコマンドですが、大きなメッセージのためそのまま実行すると見やすくありません。

1画面ずつ停止しながらメッセージを表示するには、パイプ(|)を使って dmesg コマンドの出力を less コマンドに渡して見ることができます。

dmesg コマンドは root で実行する必要があるため sudo を使います(実際に以下を実行するとパスワードを聞かれます)

sudo dmesg | less  return

tail コマンドの実行結果を system_log_tail.txt という名前でファイルに保存するには、リダイレクト(>)を使って以下のようにします。

tail /var/log/system.log > system_log_tail.txt   return

標準入力と標準出力

コマンド(プログラム)は「どこか」からデータを入力して処理を行いその実行結果を「どこか」に出力します。

標準でデータを入力する装置を標準入力(stdin)と呼び、初期状態ではキーボードが割り当てられています。

標準で処理(実行)結果を出力する装置を標準出力(stdout)と呼び、初期状態ではターミナルの画面が割り当てられています。

また、コマンドは実行結果を画面に出力しますが、この実行結果にはコマンドが実行して生成されるデータとエラーメッセージの2つの種類があります。

例えば、「指定したファイルが存在しません」や「アクセス権限がありません」などのメッセージがエラーメッセージになります。

通常は標準出力も標準エラー出力も同じ画面が出力先ですが、エラーメッセージの出力先を標準エラー出力(stderr)と呼び、出力としては区別されています。

リダイレクト

リダイレクトを使うと標準入力や標準出力、標準エラー出力を変更することができます。

例えば、キーボードから入力するのではなくファイルから入力させたり、出力先をターミナル画面ではなくファイルやプリンタにすることができます。

以下は bash に用意されているリダイレクトの記号です。

記号 意味
< 標準入力の切り替え
> 標準出力をファイルに切り替え(ファイルは新規作成され、既存ファイルは上書きされる)
>> 標準出力をファイルに切り替え(既存のファイルの最後に追加)
2> 標準エラー出力をファイルに切り替え(ファイルは新規作成され、既存ファイルは上書きされる)
2>> 標準エラー出力をファイルに切り替え(既存のファイルの最後に追加)
>& 標準出力と標準エラー出力をファイルに切り替え

ファイルから読み込む(<)

リダイレクトの < を使うと標準入力を切り替えることができます。

コマンド < ファイルのパス

例えば cat コマンドは引数を指定しない場合、標準入力のキーボードから入力を読み込みます。

以下は cat コマンドで標準入力をファイルにリダイレクトする例です。

cat     return //引数を指定しないで実行
test   return //キーボードからの入力(test)を出力
test
control + d //cat コマンド終了
          
cat < sample1.txt   return //引数を指定せずリダイレクトでファイルから読み込み
sample #1
abcdefg

//但し、cat コマンドは引数にファイルを指定できるので、以下でも同じ
cat sample1.txt 
sample #1
abcdefg

cat コマンドの場合は引数にファイルを指定できるので意味がありませんが、例えば、tr コマンドはフィルタとして使用されることを前提にしたコマンドで、引数にファイルを指定することができません。

そのような場合は、リダイレクトを使ってファイルを読み込むことができます(パイプを使って別のコマンドの実行結果を渡すこともできます)。

tr abc 123 < sample1.txt    return //リダイレクトを使ってsample1.txtを読み込む
s1mple #1
123defg

ファイルを作成 (>)

標準出力をファイルにリダイレクトすることができます。

コマンド > ファイルのパス

> を使ってリダイレクトすると、ファイルは新規作成されます。

※既存のファイルを指定した場合は、ファイルが上書きされることになります。

以下は sort コマンドを使って sample.txt をソートした結果を new_sample.txt という新しいファイルとして保存(新規作成)する例です。

sort sample.txt > new_sample.txt

以下は cat コマンドでテキストファイルを作成する例です。

cat コマンドの出力を標準出力からファイルにリダイレクトして新規にファイルを作成します。

出力先ファイルを指定して return を押すと、cat コマンドは標準入力のキーボードからの入力を待つ状態になります。

文字列を書き込み、control + d を押して終了すると、書き込まれた内容がファイルに保存されます。

cat > cat_text.txt   return //標準出力からファイルにリダイレクト
123   //キーボードから文字を入力
abc
あいう
control + d を押して終了

cat cat_text.txt   return //作成されたファイルを確認
123
abc
あいう

以下のように cat コマンド使って標準出力を新規のファイルにリダイレクトすると、ファイルをコピーすることができます。

cat cat_text.txt > copy_cat.txt  return //ファイルをコピー
cat copy_cat.txt   return //内容を確認
123
abc
あいう

//以下でも同じ
cat < cat_text.txt > copy_cat.txt

//以下のように cp コマンドを使う場合と同じ
cp cat_text.txt copy_cat.txt

注意:標準入力と標準出力を同じファイルにリダイレクトすると、中身が空になってしまいます。

cat sample.txt  return 
sample sample sample

cat < sample.txt > sample.txt    return //中身が空になる!!!

cat sample.txt  return //空なので何も表示されない 

リダイレクトによる上書き禁止

デフォルトでは、標準出力のリダイレクト(>)先を既存ファイルにした場合、警告なしで上書きされます。

bash の場合、「set -o noclobber」または「set -C」を実行すると上書きを禁止することができます。

set -C  return //または set -o noclobber
cat > sample.txt   return
-bash: sample.txt: cannot overwrite existing file //上書きできない

「>」の代わりに「>|」を使用すれば、強制的に上書きすることができます。

cat >| sample.txt return //禁止状態でも上書き可能

「set +o noclobber」または「set +C」を実行すれば上書きすることができます。

cat > sample.txt  return 
-bash: sample.txt: cannot overwrite existing file //上書きできない

set +C  return //上書き禁止を解除(または set +o noclobber)

cat > sample.txt return //上書き可能

既存ファイルに追加(>>)

既存のファイルに追加する場合は出力先ファイルを >> で指定します。指定したファイルが存在しない場合は新規作成になります。

コマンド >> ファイルのパス

以下は、echo コマンドの出力(alias copy='cp -i')を .bashrc という設定ファイルの最後に追加する例です。

echo "alias copy='cp -i'" >> ~/.bashrc  return

以下は、tail コマンドで取得する system.log の最後の3行を既存ファイル sample.txt の最後に追加する例です。

tail -3 /var/log/system.log >> sample.txt return

エラー出力をリダイレクト(2>)

bash では標準入力は「0」、標準出力は「1」、標準エラー出力は「2」の番号が割り当てられています。

標準エラー出力をリダイレクトする場合は 2> と指定します。

例えば find コマンドで検索をすると、ディレクトリにアクセス権がない場合などにエラーが出力されます。

find /System -name "*.log" return 
find: /System/Library/.../DefaultLocalDB/Default: Permission denied //エラー
find: /System/Library/User Template: Permission denied //エラー
/System/Library/Frameworks/Ruby.framework/.../nokogiri-1.5.6/mkmf.log
/System/Library/Frameworks/Ruby.framework/.../sqlite3-1.3.11/mkmf.log
/System/Library/Frameworks/Ruby.framework/.../libxml-ruby-2.9.0/mkmf.log
find: /System/Library/Caches/com.apple.receiptInstaller: Permission denied //エラー
find: /System/Library/Caches/com.apple.coresymbolicationd: Permission denied //エラー

以下はエラーメッセージを error.txt というファイルにリダイレクトして保存する例です。

find /System -name "*.log" 2> error.txt return 
System/Library/Frameworks/Ruby.framework/.../nokogiri-1.5.6/mkmf.log
/System/Library/Frameworks/Ruby.framework/.../sqlite3-1.3.11/mkmf.log
/System/Library/Frameworks/Ruby.framework/.../libxml-ruby-2.9.0/mkmf.log

cat error.txt  return //エラーメッセージは error.txt に保存される
find: /System/Library/.../DefaultLocalDB/Default: Permission denied
find: /System/Library/User Template: Permission denied
find: /System/Library/Caches/com.apple.receiptInstaller: Permission denied
find: /System/Library/Caches/com.apple.coresymbolicationd: Permission denied

以下は実行結果を log.txt に、エラーメッセージを error.txt に別々に保存する例です。

標準出力であることを明示する場合は 1> と指定することができます。

find /System -name "*.log" 1> log.txt 2> error.txt   return 

追記する場合は 2>> や 1>> を使います。

find /System -name "*.log" 1>> log.txt 2>> error.txt   return

標準出力と標準エラー出力への出力を合わせて保存する場合は、&> を使います。

find /System -name "*.log" &> all_log.txt   return

標準エラー出力は表示しない

エラーメッセージを表示しない場合は 2> /dev/null と指定して標準エラーメッセージを /dev/null(null デバイス)へリダイレクトします。

null デバイスは特別なファイルで、null デバイスへの出力は全て破棄され、どこにも出力されず、保存もされません。

find /System -name "*.log" 2> /dev/null   return
/System/Library/Frameworks/Ruby.framework/.../nokogiri-1.5.6/mkmf.log
/System/Library/Frameworks/Ruby.framework/.../sqlite3-1.3.11/mkmf.log
/System/Library/Frameworks/Ruby.framework/.../libxml-ruby-2.9.0/mkmf.log

パイプ

パイプを使うと、コマンドの標準出力を別のコマンドの標準入力につなげることができ、複数のコマンドを組み合わせて実行することができます。

言い換えると、あるコマンドの実行結果を別のコマンドに渡して実行することができます。

パイプを使用するには、コマンドとコマンドの間に「|」を記述します。

コマンド1 | コマンド2

また、パイプで接続するコマンドの数に制限はなく、リダイレクトと組み合わせて使うこともできます。

コマンド1 | コマンド2 | コマンド3 ...

以下は ls コマンドを使った /private/etc ディレクトリの一覧の出力をパイプを使って less コマンドで表示する例です。

ls -al /private/etc | less  //ls コマンドの出力をパイプで less コマンドに渡す

以下は ls コマンドの出力をパイプで sort コマンドに渡してソートしてその結果を更にパイプで less コマンドに渡す例です。

ls -al /private/etc | sort -k 2nr |less

以下は system.log で「#DECODE failed」という文字列を含まない行を grep コマンドで検索してリダイレクトを使ってカレントディレクトリに system_log.txt という名前で保存する例です。

cat /var/log/system.log | grep -v "#DECODE failed" > ./system_log.txt

フィルタコマンド

パイプと組み合わせて使われる標準入力からデータを読み込み、標準出力に出力するコマンドをフィルタコマンドと呼ぶことがあります。

以下はよく使われるフィルタコマンドです。

コマンド 概要
head テキストファイルの先頭部分を表示する
tail テキストファイルの末尾部分を表示する
grep テキストファイルから指定した文字列を含む行を検索する
sort テキストファイルを行単位で並べ替える
uniq テキストファイルの重複している行を取り除く
tr 指定した文字を置換したり削除する
wc 文字数や行数を数える

tee 標準出力とファイルに書き出す

tee コマンドは、標準入力から受け取ったデータをファイルに書き出すと同時に標準出力に出力します。

ファイルへの保存と標準出力への出力を同時に行ったり、複数のファイルに出力したりすることができます。

以下が書式です。

コマンド | tee ファイルのパス

コマンド | tee ファイル1 ファイル2 ファイル3 ...

以下は tee コマンドの主なオプションです。

オプション 意味
-a 指定したファイルが既に存在する場合は、上書きせずに追加する
-i 割り込みシグナルを無視する

以下はプロセスの一覧を表示する ps コマンドの実行結果を画面に表示し、且つファイル process.txt に書き出す(保存する)例です。

ps | tee process.txt   return
  PID TTY           TIME CMD
 6045 ttys000    0:00.00 -bash
32387 ttys000    0:01.27 -bash

cat process.txt    return
  PID TTY           TIME CMD
 6045 ttys000    0:00.00 -bash
32387 ttys000    0:01.27 -bash

以下は /usr/bin の一覧結果を bin_list.txt というファイルに保存しつつ、less コマンドで表示する例です。

ls -al /usr/bin |tee bin_list.txt | less

複数のファイルに保存

「コマンド | tee ファイル1 ファイル2 ファイル3 ...」のように指定すると、コマンドの実行結果を画面(標準出力)に出力しつつ複数のファイルに保存することができます。

以下は ls コマンドの実行結果を grep コマンドで検索して db_ が含まれる行を画面に出力しつつ、3つのファイルに書き出す例です。

ls -al /usr/bin | grep "db_" | tee 01.txt 02.txt 03.txt   return
-r-xr-xr-x    1 root   wheel    1986480  5  4 14:26 db_archive
-r-xr-xr-x    1 root   wheel    1990640  5  4 14:26 db_checkpoint
-r-xr-xr-x    1 root   wheel    2015200  5  4 14:26 db_codegen
...

xargs コマンドの引数に渡す

xargs コマンドは標準入力やファイルからリスト(1つまたは複数の文字列)を読み込み、それらを指定したコマンドの引数に渡してそのコマンドを実行します。

以下が書式です。

xargs [オプション] コマンド

以下は xargs コマンドのオプションです。

オプション 意味
-0 入力を空白や改行ではなく NULL 文字で区切る
-I replstr(置換文字列) 指定したコマンドの引数に replstr が示す置換文字列が含まれていればその位置に標準入力から読み込んだ行の内容を挿入(引数の位置を変更)
-L number(行数) 1 コマンドラインにつき最大 n 行の入力行を使用する
-p 実行前にコマンドラインをプロンプトとして表示してユーザーの入力を待つ

例えばあるコマンドの出力をパイプ(|)で xargs コマンドに送り、別のコマンドの引数として渡して実行すると言うような使い方ができます。

以下は「コマンドA」の実行結果を引数にして別の「コマンドB」を実行する書式です。

コマンドA | xargs コマンドB

以下は find コマンドを使って ./test ディレクトリ以下の拡張子が .txt のファイルを検索して、その結果を ls コマンドに -l オプションを指定して表示する例です。

find ./test -name "*.txt" | xargs ls -l   return
-rw-r--r--  1 xxxx  staff   0  8 21 09:31 ./test/bar/sample1.txt
-rw-------  1 xxxx  staff   0  8 21 09:11 ./test/bar/sample1_old.txt
-rw-r--r--@ 1 xxxx  staff  21  8 20 16:03 ./test/link_test/sample1.txt
-rw-r--r--@ 1 xxxx  staff  19  8 17 09:42 ./test/link_test/sample2.txt

コマンド置換を使っても上記と同様のことが可能です。

スペースを含む名前がある場合 (-0 オプション)

xargs コマンド使用する際に、渡される引数の値にスペースが含まれる場合はエラーになる可能性があります。

前述の find コマンドを使って検索結果を ls コマンドに渡す場合、ファイル名などにスペースがあると別の引数と解釈されてエラーになってしまいます。

例えば、sample copy.txt というスペースを含むファイルがあると以下のように ls コマンドには sample と copy.txt という2つの引数と解釈されてエラーになります。

find ./test -name "*.txt" | xargs ls -l  return
ls: ./test/bar/sample: No such file or directory  //sample と解釈されエラー
ls: copy.txt: No such file or directory  //copy.txt と解釈されエラー

xargs コマンドに -0 オプションを指定することで xargs コマンドに NULL 文字を区切り文字として判定するようにすることができます。

そして、同時に引数を渡す側の find コマンドも -print0 オプションを指定して検索結果を NULL 区切りのフルパスで出力するようにすればエラーにならないようにすることができます。

find ./test -name "*.txt" -print0 | xargs -0 ls -l  return

コマンドを確認して実行 -p

-p オプションを指定すると、実行前に xargs コマンドが作成したコマンドを確認することができます。

y または Y をユーザーが入力したら実行されます。

find ./test -name "*.txt" | xargs -p ls -l   return
ls -l ./test/link_test/find_sample.txt ./test/link_test/sample_cat.txt ./test/link_test/sample1.txt ./test/link_test/sample2.txt ./test/bar/sample1_old.txt ./test/bar/sample1.txt?...y    return//y または Y で実行
-rw-r--r--  1 xxxx  staff   0  8 21 09:31 ./test/bar/sample1.txt
-rw-------  1 xxxx  staff   0  8 21 09:11 ./test/bar/sample1_old.txt
...

1行ずつコマンドを実行 -L

-L オプションで 1 コマンドラインにつき使用する最大の入力行を指定することができます。

以下のように -p オプションを同時に指定することで1行ずつコマンドを実行することができます。

find ./test -name "*.txt" | xargs -p -L1 ls -l   return
ls -l ./test/link_test/find_sample.txt?...n   return
ls -l ./test/link_test/sample_cat.txt?...  return
ls -l ./test/link_test/sample1.txt?...   return
ls -l ./test/link_test/sample2.txt?...  return
ls -l ./test/bar/sample1_old.txt?...y    return//y または Y で実行
-rw-------  1 xxxx  staff  0  8 21 09:11 ./test/bar/sample1_old.txt
ls -l ./test/bar/sample1.txt?...y  return
-rw-r--r--  1 xxxx  staff  0  8 21 09:31 ./test/bar/sample1.txt

引数の位置を変更 -I

-I オプション(大文字の i)を使うと、変数の位置を変更することができます。-I replstr のように指定します。replstr(置換文字列)は任意の文字列ですが、{} がよく使われます。

コマンドA | xargs -I {} コマンドB 引数1 {} 引数2

例えば、上記のように指定すると、コマンドAの実行結果がコマンドBの引数1と引数2の間の {} の位置(置換文字列の位置)に1つずつ入るようになります。

以下は echo コマンドの引数の前後に文字列を挿入して出力する例です。

find ./test -name "*.txt" | xargs -I {} echo "[" {} "]"
[ ./test/link_test/find_sample.txt ]
[ ./test/link_test/sample_cat.txt ]
[ ./test/link_test/sample1.txt ]
[ ./test/link_test/sample2.txt ]
[ ./test/bar/sample1_old.txt ]
[ ./test/bar/sample1.txt ]

以下は検索したテキストファイルを現在のディレクトリに1つずつ確認しながらコピーする例です。

find ./test -name "*.txt" | xargs -p -L 1 -I{} cp {} .   return
cp ./test/link_test/find_sample.txt .?...y
cp ./test/link_test/sample_cat.txt .?...y
cp ./test/link_test/sample1.txt .?...n
cp ./test/link_test/sample2.txt .?...
cp ./test/bar/sample1_old.txt .?...
cp ./test/bar/sample1.txt .?...

コマンド置換

シェル(bash)の機能のコマンド置換(command substitution)を使うと、コマンド名をコマンドの出力で置き換えることができます。

言い換えると、コマンド名で指定したコマンドの実行結果(標準出力)を別のコマンドの引数として使用することができます。

以下が書式です。

$(コマンド)
または以下のようにバッククォートで囲みます
`コマンド` ← sh から引き継いだ古い書式(互換性を考慮した書式)

以下は、現在のユーザー名を表示するコマンド whoami をコマンド置換を使って echo コマンドの引数にする例です。

echo コマンドの引数はコマンドを展開するのでダブルクォートで囲む必要があります(シングルクォートを使うとそのまま文字列として出力されます)。

echo "現在のユーザ:$(whoami)"   return
現在のユーザ:foo  //コマンドを実行したユーザーが foo の場合 

以下は find コマンドの実行結果を ls コマンドに渡して実行する例です。

ls -l $(find ./test -name "*.txt")
      
//xargs を使って以下のようにしても同じ結果
find ./test -name "*.txt" | xargs ls -l

また、コマンド置換は入れ子にすることができます。

いかは前述と同じ内容ですが、find コマンドの引数にもコマンド置換を使って入れ子にしています。

ls -l $(find ./test -name $(echo '*.txt'))

算術式展開

計算結果を置換(展開)するには、以下の書式を使用します。

$((計算式))

この書式を使うと整数の四則演算の結果を他のコマンドの引数にすることができます。

以下は四則演算の結果を echo コマンドで出力する例です。少数を指定するとエラーになります。

echo $((1 + 2))   return  //加算
3

echo $((3 - 2))   return  //減算
1

echo $((5 * 7))   return  //乗算
35

echo $((12 / 3))   return  //除算
4

echo $((11 % 4))   return  //余り
3

echo $((8 * (3 + 4)))   return  //括弧も使えます
56

echo $((1.1 + 2))   return  //少数を指定するとエラーが表示され展開されません
-bash: 1.1 + 2: syntax error: invalid arithmetic operator (error token is ".1 + 2")

0 から始まる整数は 8 進数、0x または 0X で始まる整数は 16 進数と解釈されます。

また、n#数値の形式で記述すると n 進数と解釈されます。

echo $((0765))   return  //8 進数
501

echo $((0xFF))   return  //16 進数
255

echo $((2#11111110))   return  //2進数
254

echo $((2#11111110 + 2#00000001))   return  //2進数の加算
255

コマンドに別名を付ける alias

Unix 系 OS ではコマンドやコマンドとオプションの組み合わせに別名を付けて登録することができます。

コマンドに別名を付けることをエイリアス(alias:別名)と呼びます。

エイリアスは alias コマンドで設定及び確認することができます。

以下が alias コマンドの書式です。

alias 別名='本来のコマンド'

例えば、ファイルやディレクトリをコピーする cp コマンドを copy という別名で登録するには以下のようにします。

alias copy=cp   return
        
//オプションや引数を含めない場合は「本来のコマンド」のクォートは省略できます。

引数やオプションも含めてエイリアスを設定することもできます。以下は、cp コマンドに上書きの場合に確認をするオプション(-i)を付けて copy という別名で登録する例です。

alias copy='cp -i'   return

上記のようにすると、copy(cp -i のエイリアス)を実行するとコピー先に同名のファイルがある場合は上書きをしていいかを聞いてきます。

copy sample.txt sample2.txt   return
overwrite sample2.txt? (y/n [n])

以下は find コマンドを使ってあるディレクトリで過去1日の間に変更があったファイルを検索して一覧表示する例です。

find /Applications/MAMP/htdocs/webdesignleaves/pr -mtime -1 -type f -exec ls -l {} \;

もし、上記コマンドを頻繁に使用する場合は以下のようにエイリアスを作成しておくと便利です。

alias find_mpr='find /Applications/MAMP/htdocs/webdesignleaves/pr -mtime -1 -type f -exec ls -l {} \;'  return  //エイリアスを作成
        
find_mpr    return  //エイリアスを実行
-rwxr-xr-x  1 foo  staff  41327  9  5 10:15 /Applications/MAMP/htdocs/webdesignleaves/pr/index.html
-rw-r--r--@ 1 foo  staff  273196  9  6 08:23 /Applications/MAMP/htdocs/webdesignleaves/pr/plugins/mac_terminal_basics_01.html
...

登録済みのエイリアスの一覧を表示

alias コマンドを引数無しで実行すると、登録済みのエイリアスの一覧を表示します。

alias  return  //登録済みのエイリアスを表示
alias copy='cp -i'

既存のコマンドを同じ名前で登録(再定義)

既存のコマンドを同じ名前で登録することで、そのコマンドを再定義することができます。

例えば、rm コマンドを使う際に毎回必ず削除するかどうかを確認するように -i オプションを指定して再定義することができます。

alias rm='rm -i'  return //rm コマンドを再定義
        
alias  return //登録済みのエイリアスを表示
alias copy='cp -i'
alias rm='rm -i'

rm sample.txt   return //rm コマンドを実行すると削除するかどうかを聞かれる
remove sample.txt? n

エイリアスを一時的に無効にする

エイリアスを一時的に無効にするには、エイリアス名の前にバックスラッシュを付けて「\エイリアス名」の形式でコマンドを実行します。

例えば、前述の rm コマンドを「rm -i」という内容で再定義してある場合、-i オプションを一時的に無効にして rm コマンドを実行するには以下のようにします。

\rm sample.txt   return //確認されずに削除される 

エイリアスの削除 unalias

エイリアスを削除するには unalias コマンドを使います。

unalias エイリアス名

alias   return //登録済みのエイリアスを表示
alias copy='cp -i'
alias rm='rm -i'

unalias copy   return //エイリアス copy を削除

alias   return //登録済みのエイリアスを表示
rm='rm -i'

unalias rm   return //エイリアス rm を削除

alias   return //登録済みのエイリアスを表示(2つとも削除されている)

エイリアスの保存(~/.bashrc に記述)

エイリアスは、ターミナルの画面を閉じたりログアウトするとリセットされます。

~/.bashrc などの環境設定ファイルにエイリアスを登録すると、ログイン時に読み込まれて有効になります。

以下は echo コマンドとリダイレクトを使ってエイリアスの設定(alias copy='cp -i')を .bashrc に登録(追記)する例です。

echo "alias copy='cp -i'" >> ~/.bashrc    return/ //.bashrc に登録
        
cat ~/.bashrc    return/ //.bashrc の内容を確認
PS1="\W \$ "
alias copy='cp -i'

.bashrc はログイン時に読み込まれるので、再ログインするか、以下のコマンドを実行して設定内容をすぐに反映すればエイリアスが有効になります。

source ~/.bashrc  return/ //設定内容をすぐに反映