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

Mac のターミナルを使う方法の覚書です。ターミナルの設定や基本的なコマンド、リダイレクトやパイプの使い方など。zsh(Catalina 以降のデフォルトのシェル)に対応するように更新しました。

作成日:2019年08月26日

関連ページ

Mac のターミナル

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

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

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

Finder からターミナルを開く

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

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

または、Finder のパスバーに表示されているフォルダを右クリックして「ターミナルで開く」を選択しても、そのフォルダをカレントディレクトリとしてターミナルを開くことができます。

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

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 コマンドを使います。

ターミナルのオプション

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

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

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

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

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

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

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

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

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

「ウィンドウ」ではターミナルのサイズやウィンドウの上部に表示されるタイトルの文字などをカスタマイズすることができます。

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

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

ターミナルの上部に表示されるタイトルは、デフォルトでは作業ディレクトリ名と動作中のプロセス名及びターミナルのウィンドウサイズ(大きさ)が表示されますが、上記の「タイトル」以下のチェックボックスで表示をカスタマイズできます。

以下の例の場合、プロンプトはカレントディレクトリと % を表示するようにカスタマイズしています。また、プロファイルは「Novel」を指定しています。

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

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

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

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

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

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

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

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

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

Catalina 以降の macOS へアップデート

macOS Mojave 以前のバージョンではデフォルトのシェルが bash でしたが、Catalina 以降のバージョンでは zsh に変更になっています。

そのため、macOS Mojave 以前のバージョンを Catalina 以降のバージョンにアップデートした場合、ターミナルを開くと以下のようなメッセージが表示されます。

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

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.

内容としては「デフォルトのインタラクティブシェルは zsh になりました。zsh を使用するようにアカウントを更新するには、 `chsh -s / bin / zsh`を実行してください。詳細については、https://support.apple.com/kb/HT208050をご覧ください。」というものです。

そのまま bash を使い続けることもできますし、zsh に変更することもできます。

zsh に変更するには、上記メッセージにあるようにターミナルで以下を実行します。

chsh -s /bin/zsh return
Changing shell for xxxx.
Password for xxxx: #パスワードを求められるので入力します。

ターミナルを再起動すると、zsh に変更されます。

関連項目:シェルの変更

参考:Apple「zsh を Mac のデフォルトシェルとして使う

プロンプトの変更

zsh のプロンプトの書式は mac の初期状態では「ユーザ名@ホスト名 作業ディレクトリの名前 %」になっていますが変更することができます。

bash のプロンプトの変更は「プロンプトの変更(bash)」をご覧ください。

プロンプトの書式は、環境変数 PS1(The primary prompt string)や PROMPT で定義されています。

変数 PROMPT (または prompt) は PS1 と同じものです。

以下は現在のユーザーの PS1 の内容を出力する例です(いずれも同じ値を返します)。

echo $PS1  return #現在の PS1 の値を表示
%n@%m %1~ %#   #プロンプトの書式

echo $PROMPT  return #現在の PROMPT の値を表示
%n@%m %1~ %#

echo $prompt  return #現在の prompt の値を表示
%n@%m %1~ %# 

echo は引数に指定した値(文字列や変数など)を画面に表示(出力)するコマンドです。

%n や %m などのパラメータ(エスケープ文字)には以下のような値があります。

書式で使えるエスケープ文字の例(一部)
パラメータ 意味
%n ユーザ名 $USERNAME
%m ホスト名(最初の.まで)
%# スーパーユーザー権限がある場合は # 記号を表示し、それ以外の場合は % 記号
%d または %/ カレントディレクトリ
%~ カレントディレクトリ。カレントディレクトリが $HOME から始まる場合は 〜 で表示
%1~ カレントディレクトリ。ホームディレクトリの場合は〜(% と ~ の間に数値を指定)
%D 日付 yy-mm-dd
%W 日付 mm/dd/yy
%w 日付 day-dd
%T 時間 hh:mm
%* 時間 hh:mm:ss
%t または %@ 時間 12-hour, am/pm
%y ユーザーがログインしている端末名(tty)

%d と %/ と %~

%d と %/、及び %~ は現在の作業ディレクトリ(カレントディレクトリ)を表示しますが、%~ はカレントディレクトリが $HOME から始まる場合は $HOME に該当する部分を 〜 で表示します。

%~ の場合、/Users/foo/Projects/ なら ~/Projects

%n~ や %n/

% と ~ の間に数値 n を挿入すると、パスの最後の n 個の要素のみが表示されます。

%1~ とすると、作業ディレクトリの名前のみ(パスの最後の要素のみ)が表示されます。ホームディレクトリの場合は〜が表示されます。 これは %n/ でも機能します(例:%2/)。

一時的にプロンプトを変更するには、コマンドラインで以下のように PROMPT または PS1 に書式を指定します。必要に応じて適宜スペースを入れます(特に最後のパラメータの後)。

以下の場合、プロンプトは「カレントディレクトリ % 」になります(%1~ と %# の間及び %# の後には半角スペースを入れてあります)。

  • %1~ :カレントディレクトリ(パスの最後の要素のみ)
  • %# : % 記号(スーパーユーザー権限がある場合は # 記号)
PROMPT='%1~ %# '  return #一時的にプロンプトを変更

色を付ける

zsh の場合、プロンプトに簡単に色を付けることができます。

例えば、カレントディレクトリの部分を赤色で表示するには以下のようにします。

PROMPT='%F{red}%1~%f %# '

Fは「前景色(Foreground color)」の略です。%f(または %F) は、デフォルトのテキストの色にリセットします。上記の場合、%1~ の部分を赤色にし、%# の部分はデフォルトのテキストの色で表示します。

zsh は、黒、赤、緑、黄、青、マゼンタ、シアン、白(black, red, green, yellow, blue, magenta, cyan, white)の色を理解します。

また、%F{0} から %F{255} までの256カラーパレットにアクセスできます。例えば、F{214} を指定するとオレンジ(Orange1)になります(256 Colors Cheat Sheet)。

PROMPT='%F{214}%1~%f %# '

プロンプトの設定を ~/.zshrc に保存

コマンドラインで PROMPT に書式を指定しただけでは、ターミナルを再起動すると設定が元に戻ってしまうので、設定を保存するには ~/.zshrc などの設定ファイルに記述します。

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

また、ドット(.)が最初に付いたファイルは隠しファイルなので、Shift + Command + . を押して表示させることができます。ls コマンドの場合は -a オプションを付けます。

但し、Mac の場合、初期状態ではユーザー毎に設定できる ~/.zshrc は作成されいません。

ls -a ~  return #ユーザーディレクトリの全てのファイルを表示
.			.cups			Desktop
..			.node_repl_history	Documents
.CFUserTextEncoding	.npm			Downloads
.DS_Store		.nvm			Library
.Trash			.viminfo		Movies
.bash_history		.zsh_history		Music
.bash_profile		.zsh_sessions		Pictures
.bash_sessions		Applications		Public
.bashrc			Creative Cloud Files

~/.zshrc の作成

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

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

touch ~/.zshrc    return #空の .zshrc をユーザーディレクトリに作成

ls -a ~   return
.			.cups			Creative Cloud Files
..			.node_repl_history	Desktop
.CFUserTextEncoding	.npm			Documents
.DS_Store		.nvm			Downloads
.Trash			.viminfo		Library
.bash_history		.zsh_history		Movies
.bash_profile		.zsh_sessions		Music
.bash_sessions		.zshrc 追加(★)		Pictures
.bashrc			Applications		Public

.zshrc の編集

ターミナルに以下を入力して .zshrc を vim で編集します。

vim は vi または vim コマンドで起動することができます。引数には編集するファイルを指定します。

vi ~/.zshrc    return 

vim が開くので i を押して挿入モードにして、プロンプトの書式を記述して esc を押して挿入モードを解除します。以下の場合、プロンプトは「カレントディレクトリ名 %」のようになります。

プロンプトの書式の例
PROMPT='%1~ %# '

vim のスクリーンショット

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

.zshrc を反映

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

          source ~/.zshrc return 

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

プロンプトの書式を変更後のターミナルのスクリーンショット

関連項目:

参考:Moving to zsh, part 6 – Customizing the zsh Prompt

コマンドの実行

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

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

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

コマンドを実行後のターミナルのスクリーンショット

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

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

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

中断

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

引数の指定

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

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

コマンド 引数 引数 ...

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

以下は echo というコマンドの実行例です。

echo は引数に指定した値(文字列や変数)を画面(標準出力)に表示(出力)するコマンドです。

引数には「abc」と「123」という2つの文字列を引数として指定して実行しています。

※ 以降ではコマンドを入力する行の先頭にプロンプト「% 」を表示しています(コマンドを実行する際は % は入力しません)。

% echo abc 123 return  #echo コマンドを実行
abc 123   #引数に指定した値(文字列)が表示される

% echo    abc     123 return #コマンドと引数、引数間に半角スペースを余分に入れても結果は同じ
abc 123

man コマンドを使うとコマンドのマニュアルを見ることができます。以下は echo コマンドのマニュアルの一部抜粋です。

% man echo return  #man コマンドを実行
## 上記を実行すると以下が表示されます(終了するには q を押します)


ECHO(1)                      General Commands Manual                     ECHO(1)

NAME
     echo – write arguments to the standard output  #コマンド名と概要
	 #指定された引数を標準出力(standard output)に書き出す

SYNOPSIS
     echo [-n] [string ...]   #書式

DESCRIPTION
     The echo utility writes any specified operands, separated by single blank
     (‘ ’) characters and followed by a newline (‘\n’) character, to the
     standard output.

     The following option is available:  #指定可能なオプションの説明

     -n    Do not print the trailing newline character.  This may also be
           achieved by appending ‘\c’ to the end of the string, as is done by
           iBCS2 compatible systems.  Note that this option as well as the
           effect of ‘\c’ are implementation-defined in IEEE Std 1003.1-2001
           (“POSIX.1”) as amended by Cor. 1-2002.  Applications aiming for
           maximum portability are strongly encouraged to use printf(1) to
           suppress the newline character.

「SYNOPSIS」の下に書式が記述されています。

この場合は、echo コマンドは省略可能な -n というオプションを指定でき、引数には複数(...)の文字列(string)を指定できるというような意味になります。

echo [-n] [string ...] 

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

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

cal [[month] year]

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

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

% cal 2 2022    return # 引数を書式(month year)に従って指定
      2月 2022
日 月 火 水 木 金 土
       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

% cal           return  # 引数を省略すると現在の月のカレンダーが表示されます
      1月 2022
日 月 火 水 木 金 土
                   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
.			System			home
..			Users			opt
.VolumeIcon.icns	Volumes			private
.file			bin			sbin
.vol			cores			tmp
Applications		dev			usr
Library			etc			var

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

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

% ls -al / return   #または ls -a -l  /
total 10
drwxr-xr-x  20 root  wheel   640 12  8 08:39 .
drwxr-xr-x  20 root  wheel   640 12  8 08:39 ..
lrwxr-xr-x   1 root  admin    36 12  8 08:39 .VolumeIcon.icns -> System/Volumes/Data/.VolumeIcon.icns
----------   1 root  admin     0 12  8 08:39 .file
drwxr-xr-x   2 root  wheel    64 12  8 08:39 .vol
drwxrwxr-x  26 root  admin   832  1 16 12:59 Applications
drwxr-xr-x  70 root  wheel  2240  1 16 12:59 Library
drwxr-xr-x@  9 root  wheel   288 12  8 08:39 System
drwxr-xr-x   5 root  admin   160  1 10 17:24 Users
drwxr-xr-x   5 root  wheel   160  1 18 09:58 Volumes
drwxr-xr-x@ 38 root  wheel  1216 12  8 08:39 bin
drwxr-xr-x   2 root  wheel    64 12  8 08:39 cores
dr-xr-xr-x   3 root  wheel  4623  1 18 09:58 dev
lrwxr-xr-x@  1 root  wheel    11 12  8 08:39 etc -> private/etc
lrwxr-xr-x   1 root  wheel    25  1 18 09:58 home -> /System/Volumes/Data/home
drwxr-xr-x   2 root  wheel    64 12  8 08:39 opt
drwxr-xr-x   6 root  wheel   192 12  8 08:39 private
drwxr-xr-x@ 65 root  wheel  2080 12  8 08:39 sbin
lrwxr-xr-x@  1 root  wheel    11 12  8 08:39 tmp -> private/tmp
drwxr-xr-x@ 11 root  wheel   352 12  8 08:39 usr
lrwxr-xr-x@  1 root  wheel    11 12  8 08:39 var -> private/var

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

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

% cal -m 12 return
      12月 2022
日 月 火 水 木 金 土
             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   

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

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

バックスラッシュ \ を使う

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

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

% echo \  return  ## 改行
> apple \  return  ## 改行
> banana  return  ## 実行
apple banana

複数の引数を指定する場合は、半角スペースで区切って入力します。改行を使って複数行で入力する場合でも、引数と引数の間にはスペースが必要です。

また、コマンドと引数の間にもスペースが必要です。

% echo\  return  ## 改行(スペースがない)
> apple\  return  ## 改行(スペースがない)
> banana  return  ## 実行
zsh: command not found: echoapplebanana ##全てがつながって1つのコマンドとして理解されNG

~ % echo \    return  ## 改行
> apple\  return  ## 改行(スペースがない)
> banana  return  ## 実行
applebanana   ##スペースがないので1つの単語として出力される

% echo\  return  ## 改行(スペースがない)
>  apple\  return  ## 改行(引数の前にスペース)
>  banana  return  ## 実行(引数の前にスペース)
apple banana

エスケープキーを使う

複数のコマンドを実行する場合、改行したい位置で esc キーを押してから return を押して改行して、まとめてコマンドを実行することもできます。

% echo apple esc return  ## 改行
echo banana  return   ## 実行
apple
banana

但し、以下のように複数の引数を指定する場合はうまくいきません。

以下の場合、echo と apple、banana という3つのコマンドを実行したことになり、apple と banana というコマンドは見つかりませんというエラーが出ます。

% echo  esc return  ## 改行
apple  esc return  ## 改行
banana  return   ## 実行

zsh: command not found: apple
zsh: command not found: banana

特殊文字やクォート

特殊文字の指定

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

特殊文字(メタキャラクタ)には以下のような文字があります。

space(半角スペース) tab(タブ) |  & ; ( ) < > 

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

例えば「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
cd: too many arguments  #引数が多すぎるというエラー

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

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
quote>
//シングルクォートの後にまだ文字列が続くものと解釈され、セカンダリプロンプトが表示される

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

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

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

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

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

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

% echo $PS1  return
%1~ %#  #変数が展開されて出力される

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

% echo "$PS1"  return
%1~ %#    #変数が展開されて出力される

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

man マニュアル

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

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

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

% man cp  return //以下が表示されます。終了するには q を押します。

CP(1)                        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 contents
     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



・・・中略・・・


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 target
     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”) compatible.

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

macOS 12.1                      February 23, 2005                     macOS 12.1
(END)

マニュアルの表示

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

キー操作(一部抜粋)
キー 操作
return 一行分スクロール
e 一行分スクロール
y 一行分戻る
一行分スクロール
一行分戻る
space 1画面分スクロール
b 1画面分戻る
q 終了
/ 検索文字を入力

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

検索

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

n キーと N キーで前後のマッチした文字列に移動できます。

代替スクリーン

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

  • 代替スクリーンを表示する: shiftcommandpage Down
  • 代替スクリーンを非表示にする: shiftcommandpage Up

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

また、man コマンドを終了後、shiftcommandpage 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
DBIx::Class::Manual::Example(3pm) - Simple CD database example
DateTime::Locale::fr_CD(3pm) - Locale data examples for the French Congo - Kinshasa (fr-CD) locale
DateTime::Locale::ln_CD(3pm) - Locale data examples for the Lingala Congo - Kinshasa (ln-CD) locale
DateTime::Locale::lu_CD(3pm) - Locale data examples for the Luba-Katanga Congo -:
:  #終了するには q を押します

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
..中略..
CURLINFO_EFFECTIVE_METHOD(3) - get the last used HTTP method
CURLINFO_HTTPAUTH_AVAIL(3) - get available HTTP authentication methods
CURLINFO_HTTP_CONNECTCODE(3) - get the CONNECT response code
:  #終了するには q を押します
x-man-page

man コマンドで表示されるマニュアルは代替スクリーンで表示されるためあまり使い勝手がよくありません。

以下のように open コマンドを使って x-man-page を開くことができます。

open x-man-page://コマンド名

x-man-page は新しい別のターミナルウィンドウで開くので、マニュアルページを読みながら作業ができ、ウィンドウでスクロールしたり、Command + F で検索を使用したりすることもできます。

以下を実行すると ls コマンドのマニュアルを開くことができます。

% open x-man-page:\/\/ls  retun #ls コマンドのマニュアルを開く

以下のようなマニュアルがターミナルで表示されます。

x-man-page のスクリーンショット

open コマンドを実行するのが面倒な場合は、以下を ~/.zshrc に追加しておくと「xman コマンド名」で x-man-page を開くことができます。

~/.zshrc に追記
function xman() { open x-man-page:\/\/$@ ; }

関連:alias 関数

ターミナルのコンテクストメニューから開く

ターミナルのコマンドの文字の上で右クリックで表示されるメニューの「man ページを開く」でも x-man-page のマニュアルを表示することができます。

ターミナルのコンテクストメニューから x-man-page を開くスクリーンショット

tab の入力補完

コマンド名やファイル名の入力を tab キーを使って補完することができます。bash と若干異なります。

コマンドの補完

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

補完候補が複数ある場合は通知音が鳴り、候補の一覧が表示され、更に tab を押すと、順番に候補のコマンドが補完されます。

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

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

% cl tab #clと入力後 tab を押す(clの後にスペースは入れません)
clang    clang++  clangd   clear ##候補が表示される

% cle tab  # e を入力して tab を押す(候補が1つに絞られるので補完される)
% clear 

cl と入力後 tab を押して候補が表示された状態で、更に tab を押すと、順番に候補のコマンドに補完されます。

% cl tab #tab を押すと候補が表示される
clang    clang++  clangd   clear

% cl  tab  #更に tab を押すと最初の候補の clang に補完される
clang    clang++  clangd   clear

% clang tab #更に tab を押すと clang++ に補完される
clang    clang++  clangd   clear

% clang++  tab #更に tab を押すと clangd に補完される
clang    clang++  clangd   clear

% clangd  tab #更に tab を押すと clang  に補完される(最初の候補に戻る)
clang    clang++  clangd   clear 

bash の場合は、候補が表示されるだけです(tab キーを2回押します)。

% bash  return  #bash に切り替え

$ cl tab #tab キーを2回押す
clang    clang++  clangd   clear

$ cl tab #更に tab キーを押しても同じ
clang    clang++  clangd   clear

$ exit  return  #bash を終了
exit
% 

ファイル名とパスの補完

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

例えば、ディレクトリやファイルの一覧を表示する ls コマンドに引数の途中まで指定して tab キーを押すと、複数の候補がある場合は、候補の一覧が表示されます。

更に tab キーを押すと一つ目の候補で補完され、更に tab キーを押すと続く候補が補完されます。

候補が1つの場合は、まずその候補が補完されます。そして更に tab キーを押すと続くパスの候補が表示され、補完されていきます。

※ ls D や ls /S の後にスペースは入れません。

% ls D tab #tab キーを押すと候補一覧が表示される
Desktop/    Documents/  Downloads/

#更に tab キーを押すと1つ目の候補で補完される
% ls Desktop/ tab
Desktop/    Documents/  Downloads/

#更に tab キーを押すと2つ目の候補で補完される
% ls Documents/ tab
Desktop/    Documents/  Downloads/

#更に tab キーを押すと3つ目の候補で補完される
% ls Downloads/ tab
Desktop/    Documents/  Downloads/

#更に tab キーを押すと1つ目(最初)の候補で補完される
% ls Downloads/ tab
Desktop/    Documents/  Downloads/

#候補が1つの場合は tab キーを押すと補完されます
% ls /S   tab

#更に tab キーを押すと続くパスの候補が表示されます
% ls /System/  tab

#更に tab キーを押すと候補が順番に補完されます
% ls /System/  tab
Applications/  DriverKit/     Volumes/
Developer/     Library/       iOSSupport/

% ls /System/Applications/  tab 

bash の場合は、候補が表示されるだけです(tab キーを2回押します)。

% bash  return  #bash に切り替え

#tab キーを2回押すと候補一覧が表示される
$ ls D tab
Desktop/   Documents/ Downloads/

#更に tab キーを押しても同じ(候補が表示されるだけ)
$ ls D tab
Desktop/   Documents/ Downloads/

$ exit  return  #bash を終了
exit
% 

グロブ Glob

「グロブ」は * や ? などのワイルドカード文字の拡張(展開)を指す UNIX/シェルの用語で、ワイルドカード文字を完全なファイルパスや名前に変換します。

例えば、以下のように ls コマンドの引数に任意の文字列にマッチする * を指定して tab を押すと、該当するパスが引数に補完されるので、そのまま実行することもできますし、コマンドライン上で編集して実行することができます。

以下の場合は ~/D* としているので、~ はホームディレクトリ(/Users/foo)に展開され、Dから始まるディレクトリが補完されます(~/D* の後にスペースは入れません)。

% ls ~/D* tab を押すと以下のように補完される

#更に tab キーを押すと ~ 以下の候補が表示される
% ls /Users/foo/Desktop /Users/foo/Documents /Users/foo/Downloads tab
Applications/            Downloads/               Pictures/
Creative\ Cloud\ Files/  Library/                 Public/
Desktop/                 Movies/                  bin/
Documents/               Music/

bash の場合は、以下のように候補が表示されるだけで補完はされません(ls ~/Dtab と同じ)。

% bash  return  #bash に変更

$ ls ~/D* tab を2回押すと候補が表示される
Desktop/  Documents/  Downloads/

ls ~/D tab を押すのと同じ
Desktop/  Documents/  Downloads/

$ exit  return  #bash を終了
exit
% 

コマンド履歴

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

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

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

history コマンド

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

zsh で引数を指定せずに history コマンドを実行すると直近の15のコマンドが表示されます(bash では全履歴が表示されます)。

% history   return
  153  man history
  154  history
  155  clear
  156  cat ~.zshrc
  157  ls -a
  158  cat .zshrc
  159  vi .zshrc
  160  history
  161  tail -n 10 ~/.zsh_history
  162  cat ~/.zsh_history
  163  cat ~/.zsh_history
  164  history 1
  165  history
  166  tail -n 10 ~/.zsh_history
  167  history
  168  ls -a
   

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

番号を指定してコマンドを実行

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

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

#上記の例の場合158番の cat .zshrc が実行される

直前に実行したコマンドを実行

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

 !! return

全履歴を表示(範囲を指定して表示)

以下の書式で表示する履歴の最初の番号(first)と最後の番号(last)を指定することができます。

history [ first [ last ] ]
% history 5 30   return  ##5〜30を表示
    5  chsh -s /bin/bash
    6  echo $PS1
    7  exit
    8  chsh -s /bin/bash
・・・中略・・・
   28  echo $PROMPT
   29  echo $PS1
   30  PROMPT='%F{blue}%1~%f %# '

最後の番号(last)を省略すると最後まで表示するので、以下のように指定すると全履歴を表示することができます。

% history 1   return   ##1から最後までを表示
  1  echo $SHELL
  2  chsh -s /bin/bash
  3  echo $SHELL
  ・・・中略・・・
  175  history
  176  clear
  177  cat .zshrc

最初の番号(first)や最後の番号(last)に負の値を指定することもできます。

% history -5   return   ##直近の5件を表示
  174  cat .zshrc
  175  history
  176  clear
  177  cat .zshrc
  178  history 1

-m パターンマッチ

-m オプションを指定してマッチするパターンを指定できます。ワイルドカードが使えます。

以下は直近の15件(デフォルト)から zsh を含むコマンドを表示する例です。

% history -m '*zsh*'   return   ##zsh を含むコマンドを表示
  245  cat .zshrc
  250  tail -n 10 ~/.zsh_history
  251  cat ~/.zsh_history

% history | grep 'zsh' ## 上記はこれとほぼ同じ

以下は50番目から200番目の間で zsh を含むコマンドを表示する例です。

history -m '*zsh*' 50 200  return   ##50番目から200番目の間で zsh を含むコマンドを表示
   52  cat .zshrc
   59  cat /etc/zshenv
   60  cat /etc/zshrc
   71  man zsh
   75  cat .zsh_history
   85  vi .zshrc
   87  source .zshrc
   89  vi .zshrc
   90  source .zshrc
  156  cat ~.zshrc
  158  cat .zshrc
  159  vi .zshrc
  161  tail -n 10 ~/.zsh_history
  162  cat ~/.zsh_history
  163  cat ~/.zsh_history
  166  tail -n 10 ~/.zsh_history
  174  cat .zshrc
  177  cat .zshrc
  183  man zshbuiltins

※最初の番号(first)や最後の番号(last)は -m オプションの後に指定しないと機能しないようです。

以下は全ての履歴で zsh を含むコマンドを表示する例ですが、1 を -m オプションの前に指定するとエラーになります。

% history 1 -m '*zsh*'  return   ##全ての履歴で zsh を含むコマンドを表示(NG)
fc: event not found: -m  ## エラー

% history -m '*zsh*' 1  return   ##全ての履歴で zsh を含むコマンドを表示(OK)
   40  touch ~/.zshrc
   47  vi ~/.zshrc
   48  source ~/.zshrc
   52  cat .zshrc
   59  cat /etc/zshenv
   ・・・以下省略・・・

実行時刻を表示

history コマンドに -d や -f オプションを指定して、コマンドを実行した時刻や日時(タイムスタンプ)を表示することができます。また、-D オプションを指定して実行時間を表示することもできます。

% history -d  return   #時刻を表示
 1013  07:11  tail -3 .zsh_history
 1014  07:15  vi .zshrc
 1015  07:17  source .zshrc
 1016  07:19  cat .zshrc
 1017  07:20  sleep 5

 % history -f  return  #MM/DD/YY hh:mm 形式で表示
 1013  1/30/2022 07:11  tail -3 .zsh_history
 1014  1/30/2022 07:15  vi .zshrc
 1015  1/30/2022 07:17  source .zshrc
 1016  1/30/2022 07:19  cat .zshrc
 1017  1/30/2022 07:20  sleep 5

 % history -i  return  #yyyy-mm-dd hh:mm 形式で表示
 1013  2022-01-30 07:11  tail -3 .zsh_history
 1014  2022-01-30 07:15  vi .zshrc
 1015  2022-01-30 07:17  source .zshrc
 1016  2022-01-30 07:19  cat .zshrc
 1017  2022-01-30 07:20  sleep 5

 % history -iD  return   #-D オプションを同時に指定して実行時間(経過時間)も表示
 1013  2022-01-30 07:11  0:00  tail -3 .zsh_history
 1014  2022-01-30 07:15  1:58  vi .zshrc
 1015  2022-01-30 07:17  0:00  source .zshrc
 1016  2022-01-30 07:19  0:00  cat .zshrc
 1017  2022-01-30 07:20  0:05  sleep 5
 

history の man

zsh の history の man ページは man zshbuiltins で見ることができます。但し、history の項目には「Same as fc -l.」とあるので、fc コマンドの箇所を見る必要があります。

マーク機能

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

自動的または手動で設定したマークやブックマークの位置にキー操作で移動することができます。

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

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

または、マークしたい行を選択してショートカットメニューから「マーク」を選択することもできます(または 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 # または cd - (ハイフンのみ)でも同じ

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

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

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

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

% cp ~/Desktop/sample.txt .  return

チルダ展開

例えば、以下のように echo コマンドで引数に ~ を指定して実行すると、現在のユーザ(以下の例では foo)のホームディレクトリが表示されます。

% echo ~    return
/Users/foo   #ユーザ foo のホームディレクトリ

#引用符で囲むと文字列として扱われます
% echo '~'    return #シングルクォートで囲む
~  #文字 ~ が出力される

% echo "~"    return #ダブルクォートで囲む
~  #文字 ~ が出力される

これは、echo コマンドが ~ をホームディレクトリに変換しているのではなく、シェルがこれらの特別な文字を認識して変換しています。

このようにシェルが特別な文字や記号を自動的に変換する機能を展開と呼び、~(チルダ)をシェルが自動的に変換する機能をチルダ展開と呼びます。

チルダ展開は、~(チルダ)が引用符で囲まれてない場合は、「~」を現在のユーザのホームディレクトリに置き換えます。

「~-」ならば、シェル変数 OLDPWD の値(1つ前のカレントディレクトリ)に置き換え、「~+」ならば、シェル変数 PWD の値(カレントディレクトリ)に置き換えます。

PWD や OLDPWD、HOME などは環境変数と呼ばれるシェルの動作に関わる値が格納されている変数です。

以下はユーザ foo がカレントディレクトリやそこから移動した場合の「~」などの値を確認する例です。

% echo $HOME  return # $HOME(ホームディレクトリの値が入っている変数)を表示
/Users/foo    # foo のホームディレクトリ

% pwd     return #現在のディレクトリを表示
/Users/foo    # 現在は foo のホームディレクトリにいる

% echo ~     return # ~(ホームディレクトリ)を表示
/Users/foo    # foo のホームディレクトリ

% cd test    return # test ディレクトリに移動

% pwd    return #現在のディレクトリを表示
/Users/foo/test   # 現在は test ディレクトリにいる

% echo ~-    return #OLDPWD の値(1つ前のカレントディレクトリ)を表示
/Users/foo

% echo ~    return # ~(ホームディレクトリ)を表示
/Users/foo    # foo のホームディレクトリ(現在の位置に関係なくホームディレクトリが表示される)


% echo ~+     return #PWDの値(カレントディレクトリ)を表示
/Users/foo/test

関連項目:シェルの展開順序

ワイルドカード(パス名展開/ブレース展開)

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

ワイルドカードの例
ワイルドカード 意味
* 任意の文字列(長さ0以上の文字列)とマッチ
? 任意の1文字とマッチ
[文字] 指定した文字(複数や範囲を指定可能)の中の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」にマッチします。

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

% ls [abc]*.php  return
about.php			async-upload.php
admin-ajax.php			authorize-application.php
admin-footer.php		comment.php
admin-functions.php		credits.php
admin-header.php		custom-background.php
admin-post.php			custom-header.php
admin.php			customize.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

パス名展開

コマンドの引数にワイルドカードの文字( * 、 ? 、 [ ])が含まれていると、パターンと見做されてシェルがそのパターンにマッチするファイル名やディレクトリ名を探し出して置き換える機能があり、パス名展開(pathname expansion)と言います。

パス名展開のルールは前述のワイルドカードとほぼ同じです。

但し、シングルクォート(')やダブルクォート(")で括られた文字列はパターンマッチからは除外され、そのままコマンドに渡されます。

zsh でも同様に機能します。関連:グロブ Glob

% echo '*'  return  #文字として表示される
*

% echo "*"  return  #文字として表示される
*

% echo *  return #カレントディレクトリのファイルやディレクトリが表示される
Applications Library System Users Volumes bin cores dev etc home opt private sbin tmp usr var

% echo *.txt  return #マッチするファイルが表示される
error.txt fist.txt log.txt sample.txt

% echo ??? return #3文字に該当するものが表示される
bin dev etc opt tmp usr var

% echo [a-z][a-z][a-z]  return #3文字に該当するものが表示される
bin dev etc opt tmp usr var

% echo [^0-9][^0-9][^0-9]  return #3文字に該当するものが表示される
bin dev etc opt tmp usr var

% echo "[^0-9][^0-9][^0-9]"  return  #文字として表示される
[^0-9][^0-9][^0-9]

関連項目:シェルの展開順序

ブレース展開

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

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

zsh でも同様に機能します。

% 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			...

コマンドを連続して実行

複数のコマンドを連続して実行することができます(複数のコマンドの実行を一行で記述できます)。以下は2つのコマンドの例を記載していますが、2つ以上のコマンドを連続して実行することができます。

実行結果に関わらずコマンド1が終了したらコマンド2を実行(;)

; 演算子で複数のコマンドを連結するとコマンドの実行結果に関わらず、順番にコマンドが実行されます。

command1 ; command2
//command1 が失敗しても、command2 は実行されます

コマンド1が成功したらコマンド2を実行する(&&)

&& 演算子で複数のコマンドを連結すると前のコマンドが成功した場合のみその次のコマンドが実行されます。前のコマンドが失敗すると、その後のコマンドは実行されません。

command1 && command2
//command1 が成功した場合のみ、command2 が実行されます

以下は cd コマンドで移動して、その後 ls コマンドでそのディレクトリを一覧表示する例です。

移動先のディレクトリが存在すれば、次の ls コマンドは実行されますが、移動先のディレクトリが存在しない場合は ls コマンドは実行されません。

% cd myProject && ls  return
//移動後に一覧表示
index.js		package-lock.json
node_modules		package.json

% cd test && ls  return
cd: no such file or directory: test
//test というディレクトリがないので ls コマンドは実行されない

% cd test ; ls  return //; で連結すると前のコマンドの実行結果に関わらず次のコマンドも実行される
cd: no such file or directory: test
index.js		package-lock.json
node_modules		package.json

コマンド1が失敗した場合のみコマンド2を実行する(||)

|| 演算子で複数のコマンドを連結すると前のコマンドが失敗した場合のみその次のコマンドが実行されます。前のコマンドが成功すると、その後のコマンドは実行されません。

command1 || command2
//command1 が失敗した場合のみ、command2 が実行されます
% cd test || ls    return
//cd が失敗したので ls が実行される
cd: no such file or directory: test
index.js		package-lock.json
node_modules		package.json

% cd myProject || ls    return
//cd が成功したので ls は実行されない(cd による移動のみが実行される)

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

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

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

ディレクトリ

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

以下は Finder から見たルートディレクトリ(Macintosh HD)のディレクトリ構造です。

Finder でみたファイル構造

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

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

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

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

以下はルートディレクトリで ls -a コマンドで隠しファイルを含めた一覧を表示した例です。

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

以下は ls -al コマンドで一覧の詳細を表示した例です。

% ls -al return  //隠しファイルを含む一覧の詳細を表示
total 10
drwxr-xr-x  20 root  wheel   640 12  8 08:39 .
drwxr-xr-x  20 root  wheel   640 12  8 08:39 ..
lrwxr-xr-x   1 root  admin    36 12  8 08:39 .VolumeIcon.icns -> System/Volumes/Data/.VolumeIcon.icns  #シンボリックリンク
----------   1 root  admin     0 12  8 08:39 .file
drwxr-xr-x   2 root  wheel    64 12  8 08:39 .vol
drwxrwxr-x  26 root  admin   832  1 16 12:59 Applications
drwxr-xr-x  70 root  wheel  2240  1 16 12:59 Library
drwxr-xr-x@  9 root  wheel   288 12  8 08:39 System
drwxr-xr-x   5 root  admin   160  1 10 17:24 Users
drwxr-xr-x   5 root  wheel   160  1 19 12:49 Volumes
drwxr-xr-x@ 38 root  wheel  1216 12  8 08:39 bin
drwxr-xr-x   2 root  wheel    64 12  8 08:39 cores
dr-xr-xr-x   3 root  wheel  4623  1 18 09:58 dev
lrwxr-xr-x@  1 root  wheel    11 12  8 08:39 etc -> private/etc  #シンボリックリンク
lrwxr-xr-x   1 root  wheel    25  1 18 09:58 home -> /System/Volumes/Data/home  #シンボリックリンク
drwxr-xr-x   2 root  wheel    64 12  8 08:39 opt
drwxr-xr-x   6 root  wheel   192 12  8 08:39 private
drwxr-xr-x@ 65 root  wheel  2080 12  8 08:39 sbin
lrwxr-xr-x@  1 root  wheel    11 12  8 08:39 tmp -> private/tmp  #シンボリックリンク
drwxr-xr-x@ 11 root  wheel   352 12  8 08:39 usr
lrwxr-xr-x@  1 root  wheel    11 12  8 08:39 var -> private/var  #シンボリックリンク

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

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

ディレクトリ 概要(配置されるファイル)
/ ルートディレクトリ(Macintosh HD)
/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		Downloads		Pictures
Creative Cloud Files	Library			Public
Desktop			Movies
Documents		Music

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

% ls /Users/foo/Desktop return  //引数にユーザ foo のデスクトップのパスを指定

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

% ls Desktop return  //相対パスで指定

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

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

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

% ls Documents Desktop return
Desktop:
#デスクトップのディレクトリやファイルが表示される

Documents:
#ドキュメント(書類)のディレクトリやファイルが表示される

-a 隠しファイルを表示

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

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

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

% ls -a / return  //オプション -a とパス / を指定
.			System			home
..			Users			opt
.VolumeIcon.icns	Volumes			private
.file			bin			sbin
.vol			cores			tmp
Applications		dev			usr
Library			etc			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 //オプション -l とパス / を指定
total 10
drwxrwxr-x  26 root  admin   832  1 16 12:59 Applications
drwxr-xr-x  70 root  wheel  2240  1 16 12:59 Library
drwxr-xr-x@  9 root  wheel   288 12  8 08:39 System
drwxr-xr-x   5 root  admin   160  1 10 17:24 Users
drwxr-xr-x   5 root  wheel   160  1 19 12:49 Volumes
drwxr-xr-x@ 38 root  wheel  1216 12  8 08:39 bin
drwxr-xr-x   2 root  wheel    64 12  8 08:39 cores
dr-xr-xr-x   3 root  wheel  4623  1 18 09:58 dev
lrwxr-xr-x@  1 root  wheel    11 12  8 08:39 etc -> private/etc
lrwxr-xr-x   1 root  wheel    25  1 18 09:58 home -> /System/Volumes/Data/home
drwxr-xr-x   2 root  wheel    64 12  8 08:39 opt
drwxr-xr-x   6 root  wheel   192 12  8 08:39 private
drwxr-xr-x@ 65 root  wheel  2080 12  8 08:39 sbin
lrwxr-xr-x@  1 root  wheel    11 12  8 08:39 tmp -> private/tmp
drwxr-xr-x@ 11 root  wheel   352 12  8 08:39 usr
lrwxr-xr-x@  1 root  wheel    11 12  8 08:39 var -> private/var

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

% ls -lh / return
total 10
drwxrwxr-x  26 root  admin   832B  1 16 12:59 Applications
drwxr-xr-x  70 root  wheel   2.2K  1 16 12:59 Library
drwxr-xr-x@  9 root  wheel   288B 12  8 08:39 System
drwxr-xr-x   5 root  admin   160B  1 10 17:24 Users
drwxr-xr-x   5 root  wheel   160B  1 19 12:49 Volumes
drwxr-xr-x@ 38 root  wheel   1.2K 12  8 08:39 bin
...

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

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

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

% ls -F / return
Applications/	Volumes/	etc@		sbin/
Library/	bin/		home@		tmp@
System/		cores/		opt/		usr/
Users/		dev/		private/	var@

ls コマンドのオプション

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

NAME
     ls -- list directory contents

SYNOPSIS
     ls [-@ABCFGHILOPRSTUWabcdefghiklmnopqrstuvwxy1%,] [--color=when]
        [-D format] [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 ~/Desktop return  #ユーザのデスクトップへ移動(絶対パスのようなもの)

% cd /Users/foo/Desktop  return  #ユーザ(foo)のデスクトップへ移動(絶対パス)

% cd /Applications/MAMP/htdocs   return  #MAMP の htdocs へ移動(絶対パス)
コマンド 説明
cd 引数なしで実行するとホームディレクトリへ移動
cd ~ ユーザのホームディレクトリへ移動(上記と同じこと)
cd .. 1つ上の階層へ移動。2つ上の階層への移動は cd ../..
cd / ルートディレクトリへ移動
cd - 直前にいたディレクトリに移動
cd ~- 直前にいたディレクトリに移動(上記と同じこと)チルダ展開

直前にいたディレクトリに移動

直前にいたディレクトリに移動するには cd - を使います。cd - を使うと直前のディレクトリと現在のディレクトリ2つのディレクトリを交互に移動できます。

% cd /Applications/MAMP/htdocs/myProject  return  # myProject に移動

% cd /Applications/MAMP/conf/apache  return  # apache に移動

% cd -    return  #直前にいたディレクトリ(myProject)に移動
/Applications/MAMP/htdocs/myProject  #移動先のディレクトリが表示される

% cd -   return  #直前にいたディレクトリ(apache)に移動
/Applications/MAMP/conf/apache  #移動先のディレクトリが表示される

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

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

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

また、Finder で右クリックしてターミナルを開くこともできます(Finder からターミナルを開く)。

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

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

pwd コマンドはカレントディレクトリ(現在の作業ディレクトリ)のパスを表示します。pwd は Print(または Present) Working Directory の略になります。

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

直前にいたディレクトリのパスは $OLDPWD、ホームディレクトリのパスは $HOME で表示できます。

% cd   return  //ホームディレクトリへ移動

% pwd   return //#現在作業しているディレクトリのパスを表示
/Users/foo

% echo $OLDPWD   return //直前にいたディレクトリのパスを表示
/Applications/MAMP/conf/apache/extra

% echo $HOME   return  //ホームディレクトリのパスを表示
/Users/foo
pushd / popd / dirs

pushd コマンドはカレントディレクトリのパスをディレクトリスタックに保存して、指定した引数のディレクトリに移動するコマンドです。

ディレクトリスタックとはディレクトリの位置(パス)を保存しておくための記憶領域で、後に入れたものが先に出る構造(スタック)になっています。

pushd コマンドはディレクトリスタックの状態(保存されているパス)を確認する dirs コマンド、ディレクトリスタックから保存されているパスを削除する popd コマンドと使用します。

以下は使用例です。

pushd コマンドを実行すると、指定した引数のディレクトリに移動し、カレントディレクトリ(移動先)のパスをディレクトリスタックの先頭に保存します。

また、その際にその時点でのディレクトリスタック(保存されているパス)が横一列に表示されます。

dirs コマンドに -v オプションを指定するとディレクトリスタックを0から番号付きで表示します。

% pwd  return //カレントディレクトリのパスを表示
/Users/foo  #現在のディレクトリ(ホームディレクトリ:~)

% pushd Desktop return //Desktopへ移動(スタックへ保存)
~/Desktop ~  # ディレクトリスタックが表示される

% pushd ../Documents  return  // Documentsへ移動(スタックへ保存)
~/Documents ~/Desktop ~  # ディレクトリスタック

% pushd /Applications/MAMP/htdocs/myProject return //myProjectへ移動(スタックへ保存)
/Applications/MAMP/htdocs/myProject ~/Documents ~/Desktop ~ #ディレクトリスタック

% dirs -v return  //dirs(スタック)の状態を -v を指定して確認
0	/Applications/MAMP/htdocs/myProject  #カレントディレクトリ
1	~/Documents  #直前にいたディレクトリ
2	~/Desktop  #その前にいたディレクトリ
3	~  #その前の前にいたディレクトリ

% pushd +2 return  //2の Desktop へ移動し、スタックの2を先頭に移動(全体をずらす)
~/Desktop ~ /Applications/MAMP/htdocs/myProject ~/Documents

% dirs -v return  //dirs の状態を -v を指定して確認
0	~/Desktop (前の2が0に、3が1に、0が2に、1が3にずれている)
1	~
2	/Applications/MAMP/htdocs/myProject
3	~/Documents

% pushd +2 return  //2の myProject へ移動し、スタックの2を先頭に移動(全体をずらす)
/Applications/MAMP/htdocs/myProject ~/Documents ~/Desktop ~

% dirs -v return  //dirs の状態を -v を指定して確認
0	/Applications/MAMP/htdocs/myProject
1	~/Documents
2	~/Desktop
3	~

% pushd return  //引数無しで実行(1へ移動し、スタックの1と0を入れ替える)
~/Documents /Applications/MAMP/htdocs/myProject ~/Desktop ~

% dirs -v return  //dirs の状態を -v を指定して確認
0	~/Documents
1	/Applications/MAMP/htdocs/myProject
2	~/Desktop
3	~

% pushd   return  //引数無しで実行(1へ移動し、スタックの1と0を入れ替える)
/Applications/MAMP/htdocs/myProject ~/Documents ~/Desktop ~

% dirs -v return  //dirs の状態を -v を指定して確認
0	/Applications/MAMP/htdocs/myProject
1	~/Documents
2	~/Desktop
3	~

% popd return  //カレントディレクトリのパスを削除(スタックの1へ移動)
~/Documents ~/Desktop ~

% dirs -v return  //dirs の状態を -v を指定して確認
0	~/Documents
1	~/Desktop
2	~

pushd

pushd コマンドにディレクトリを指定すると、指定したディレクトリのパスをディレクトリスタックの先頭に追加して、指定したディレクトリに移動します。

pushd コマンドが成功すると、 dirs コマンドも実行され、ディレクトリスタックが表示されます。

+ や - にスタックに保存されたパスの番号を指定することもできます(番号は0から始まります)。

引き数を指定しない場合は、 スタックの一番上の 2 つのディレクトリを交換します(入れ替えます)。

pushd [オプション] [ディレクトリ]
オプション 説明
+番号 上(左)から n 番目のディレクトリをスタックの一番上にして、スタックをローテート(回転)させます。エントリは 0 から数えます。
-番号 後ろ(右)から n 番目のディレクトリをスタックの一番上にして、スタックをローテート(回転)させます。

popd

popd コマンドは、ディレクトリスタックからエントリ(パス)を削除します。

引き数を指定しない場合には、スタックの先頭のディレクトリが削除され、 新しく先頭となったディレクトリへ移動します。

popd [オプション]
オプション 説明
+番号 上(左)から n 番目のエントリを削除します。エントリは 0 から数えるので、popd +1 は2番目のディレクトリを削除します。
-番号 後ろ(右)から n 番目のエントリを削除します。エントリは 0 から数えるので、popd -0 は最後のディレクトリを、popd -1 は最後の1つ前のディレクトリを削除します。

dirs

dirs コマンドは、ディレクトリスタックの内容を表示します。また、-c オプションを指定するとディレクトリスタックをクリアします。

dirs [オプション]
オプション 説明
-v 各エントリの前にスタック内での番号を表示し、1行に1エントリ(パス)の形式でディレクトリスタックを出力します。
+番号 上(左)から数えて n 番目のエントリを表示します。エントリは 0 から数えます。
-番号 後ろ(右)から数えて n 番目のエントリを表示します。エントリは 0 から数えます。
-c 全てのエントリを削除し、ディレクトリスタックをクリアします。

cd コマンドとの併用

pd コマンドでディレクトリを移動して、その後 cd - と入力後 tab キーを押すと pushd で保存されたディレクトリスタックが補完リストに表示されます(cd + tab キーではその逆順にリストを表示)。

※ 但し、cd で移動すると移動前のカレントディレクトリのパス(スタックの0番)が上書きされてしまうので、混乱しやすいかも知れません。

また、cd を使って移動前のカレントディレクトリのパスを保持したい場合は pushd . とすれば可能ですが、使いやすくはないかも知れません。

% pushd /etc  return //etc へ移動(スタックへ保存)
/etc ~

% pushd /Users  return //Users へ移動(スタックへ保存)
/Users /etc ~

% pushd /dev    return //dev へ移動(スタックへ保存)
/dev /Users /etc ~

% pushd /bin   return //bin へ移動(スタックへ保存)
/bin /dev /Users /etc ~

% dirs -v   return //ディレクトリスタックを表示
0	/bin
1	/dev
2	/Users
3	/etc
4	~

% cd -  tab //tab キーを押すと補完リストが表示される
0 -- ~
1 -- /etc
2 -- /Users
3 -- /dev

% cd -1  return //1 の etc に移動
/etc

% dirs -v  return
0	/etc  # /bin が上書きされている
1	/dev
2	/Users
3	~

% pushd .  return  //カレントディレクトリのパスを保存
/etc /etc /dev /Users ~

% dirs -v  return  //カレントディレクトリのパスが追加される
0	/etc
1	/etc
2	/dev
3	/Users
4	~

% cd -  tab //tab キーを押すと補完リストが表示される
0 -- ~
1 -- /Users
2 -- /dev
3 -- /etc

% cd -2 return // 2 を選択
/dev

% dirs -v
0	/dev
1	/etc
2	/Users
3	~

エイリアス

ディレクトリの移動は頻繁に行うので、pushd とタイプするのが面倒な場合はエイリアスを作成しておくと便利かも知れません。

例えば、以下を ~/.zshrc に追加しておくと、pd で pushd コマンドを、pd2 で pushd +2 を、dirs で dirs -v を、pdn 5 で pushd +5 を実行できます。

~/.zshrc (一部抜粋)
alias pd=pushd
alias pd2='pushd +2'
alias pd3='pushd +3'
alias pd4='pushd +4'
alias dirs='dirs -v'
function pdn() { pushd +"$1"}

但し、上記の場合、alias dirs='dirs -v' を設定しているので、例えばディレクトリスタックをクリアするには一時的にエイリアスを無効にして \dirs -c とする必要があります。

テキストファイルの表示

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  //内容を確認
sample1
abcdefg

% cat sample2.txt   return  //内容を確認
sample2
1234567

% cat sample1.txt sample2.txt  return  //連続して表示
sample1
abcdefg
sample2
1234567

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

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

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

NAME
     cat – concatenate and print files

SYNOPSIS
     cat [-belnstuv] [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).

     The options are as follows:

     -b      Number the non-blank output lines, starting at 1.

     -e      Display non-printing characters (see the -v option), and display a
             dollar sign (‘$’) at the end of each line.

     -l      Set an exclusive advisory lock on the standard output file
             descriptor.  This lock is set using fcntl(2) with the F_SETLKW
             command.  If the output file is already locked, cat will block
             until the lock is acquired.

     -n      Number the output lines, starting at 1.

・・・以下省略・・・
(man コマンドを終了するには q を押します)

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

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

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

% cat    return
hello cat!   #文字を入力して return
hello cat!   #入力された文字が出力される
cat test     #文字を入力して return
cat test     #入力された文字が出力される
control + d を押して終了

End Of File / EOF

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

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

less

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

似たようなコマンドに more というコマンドがあります。

以下が書式です。

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

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

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

以下は /private/etc/apache2/ にある httpd.conf というファイルを表示する例です。

% less /private/etc/apache2/httpd.conf   return

以下のように指定したファイルが表示されます。

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

次の画面へ進むにはスペースキー、1行ずつ進めたい場合は Enter キーを押します。上下の矢印キーで上下にスクロールすることも可能です。終了するには q キーを押します。

以下は行番号付き(-N)で50行目(+50)から表示する例です。

% less -N +50 /private/etc/apache2/httpd.conf    return

以下のように指定した行から行番号付きでファイルが表示されます。

less コマンドで行番号付き(-N)で50行目(+50)からファイルを開いた状態のスクリーンショット

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

% less -N -p FollowSymLinks /private/etc/apache2/httpd.conf    return

以下のように検索(-p)に指定した文字列がハイライトされ、行番号付きでファイルが表示されます。

less コマンドで文字列を検索(-p)して行番号付き(-N)でファイルを開いた状態のスクリーンショット

マッチした文字列が複数ある(全てが画面に表示できない)場合は、n または N キーで前後のマッチした文字列に移動できます。

表示画面でのキー操作

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

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

文字列を検索

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

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

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

以下は less コマンドで /private/etc/ にある zshrc_Apple_Terminal というファイルを開いて文字列を検索する例です。

% less /private/etc/zshrc_Apple_Terminal    return

ファイルが開きます。

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

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

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

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

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

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

検索を続けマッチした文字列がハイライトされた状態のスクリーンショット

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

終了するには q を押します。

head / tail

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

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

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

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

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

% head -n 5 /etc/ssh/ssh_config     return
#	$OpenBSD: ssh_config,v 1.35 2020/07/17 03:43:42 dtucker 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
#   ProxyCommand ssh -q -W %h:%p gateway.example.com
#   RekeyLimit 1G 1h
#   UserKnownHostsFile ~/.ssh/known_hosts.d/%k
Host *
    SendEnv LANG LC_*

ログファイルの監視

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

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

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

% tail -f /var/log/system.log      return
Jan 20 15:13:46 xxxx-iMac login[32383]: DEAD_PROCESS: 32383 ttys000
Jan 20 15:13:51 xxxx-iMac login[32667]: USER_PROCESS: 32667 ttys000
Jan 20 15:14:20 xxxx-iMac login[32667]: DEAD_PROCESS: 32667 ttys000
Jan 20 15:14:24 xxxx-iMac login[32948]: USER_PROCESS: 32948 ttys000
Jan 20 15:16:13 xxxx-iMac syslogd[116]: ASL Sender Statistics
Jan 20 15:27:25 xxxx-iMac syslogd[116]: ASL Sender Statistics
Jan 20 15:38:24 xxxx-iMac syslogd[116]: ASL Sender Statistics
Jan 20 15:49:17 xxxx-iMac syslogd[116]: ASL Sender Statistics
......

#終了するには 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

mkdir と同時に cd でディレクトリに移動

ディレクトリを作成する際に同時に作成したディレクトリに移動をするには以下のようにします。

&& は、前のコマンドが成功した場合に次のコマンドを実行します(コマンドを連続して実行)。

$_ はシェルの特殊変数で、「ひとつ前に実行したコマンドラインの最後の引数」を参照します。

% mkdir new_dir && cd $_     return
//新規に new_dir というディレクトリを作成し、そのディレクトリへ移動

作成時にパーミッションを設定する

-m オプションを指定するとディレクトリを作成する際にパーミッションを設定することができます。

% mkdir -m 700 foo  return  //rwx を所有者のみに設定(700)

% ls -ld foo return  //ディレクトリのパーミッションを確認
drwx------  2 xxxx  staff  64  6  3 08:50 foo

rmdir ディレクトリの削除

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

ホームディレクトリ
└── myDir
    └── foo
        ├── bar (空のディレクトリ)
        └── sample.txt

上記のような構成の場合、bar ディレクトリを削除するには以下を実行します。

% rmdir ~/myDir/foo/bar   return  #空のディレクトリの削除

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

% rmdir ~/myDir   return
rmdir: /Users/xxxx/myDir: Directory not empty  #ディレクトリが空ではないので削除できない

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

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

% rm -r ~/myDir   return

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

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

% rm -ir ~/myDir   return
examine files in directory /Users/xxxx/myDir? y  #myDir を検査するかと聞かれるので y
remove /Users/xxxx/myDir/.DS_Store? y  #.DS_Store を削除するかと聞かれるので y で削除
examine files in directory /Users/xxxx/myDir/foo? y
remove /Users/xxxx/myDir/foo/.DS_Store? y
remove /Users/xxxx/myDir/foo? y
remove /Users/xxxx/myDir/sample.txt? 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 Desktop/sample.txt   return
16777220 2794388 -rw-r--r-- 2 foo staff 0 20 "Jan 20 16:46:33 2022" "Jan 20 16:46:21 2022" "Jan 20 16:46:33 2022" "Jan 20 13:43:58 2022" 4096 8 0 Desktop/sample.txt

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

stat -x Desktop/sample.txt  return
File: "Desktop/sample.txt"
  Size: 20           FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/  foo)  Gid: (   20/   staff)
Device: 1,4   Inode: 2794388    Links: 2
Access: Thu Jan 20 16:46:33 2022
Modify: Thu Jan 20 16:46:21 2022
Change: Thu Jan 20 16:46:33 2022

以下は -f を使ってフォーマットを指定して、デバイス番号と i-node 番号、最終アクセス日時、ファイルタイプとパーミッションを表示する例です。

% stat -f "Device Num:%d i-node: %i atime: %a file-type permission: %p" Desktop/sample.txt   return
Device Num:16777220 i-node: 2794388 atime: 1642664793 file-type permission: 100644

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

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

% stat -l Desktop/sample.txt  return
-rw-r--r-- 2 foo staff 20 Jan 20 16:46:21 2022 Desktop/sample.txt

% ls -lT  Desktop/sample.txt  return
-rw-r--r--@ 2 foo  staff  20  1 20 16:46:21 2022 Desktop/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 Desktop/sample.txt  return //状態を確認
  File: "Desktop/sample.txt"
  Size: 20           FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/  foo)  Gid: (   20/   staff)
Device: 1,4   Inode: 2794388    Links: 2
Access: Thu Jan 20 16:46:33 2022
Modify: Thu Jan 20 16:46:21 2022
Change: Thu Jan 20 16:46:33 2022


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

% stat -x Desktop/sample.txt   return
  File: "Desktop/sample.txt"
  Size: 20           FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (  501/  foo)  Gid: (   20/   staff)
Device: 1,4   Inode: 2794388    Links: 2
Access: Fri Jan 21 10:28:04 2022 #更新されている
Modify: Fri Jan 21 10:28:03 2022 #更新されている
Change: Fri Jan 21 10:28:03 2022 #更新されている

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

% touch -r Desktop/01.txt Desktop/sample.txt 

空のファイルを作成

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

指定したファイルがファイルが存在している場合は、そのファイルのタイムスタンプが変更されます。

-c オプションを付けて実行すると存在しないファイル名を指定した場合に新規ファイルを作成しません。

% ls   return
sample1.txt  #1つのファイルのみ(sample2.txt は存在しない)

% touch sample2.txt    return  #sample2.txt を作成

% ls    return
sample1.txt	sample2.txt  #sample2.txt が作成された

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

% ls    return
sample1.txt	sample2.txt t  #sample3.txt は作成されていない

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

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

以下が書式です。

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

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

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

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

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

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

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

% find .  return 

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

ホームディレクトリを 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
/private/etc/bashrc_Apple_Terminal
/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
・・・以下省略・・・

ファイル名を検索 -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、HFS+、AFP 以外のファイルシステム(FAT や NFS など)にファイルを保存する際は、2つのファイルに分離して保存するフォーマット(AppleDouble)が使われ、データフォーク(内容自体)を本来のファイル名で保存し、リソースフォーク(ファイルについての情報)を「._」を先頭に付けたファイル名で保存します(このファイルを ._ ファイルや AppleDouble ファイルとも呼びます)。

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

全ての拡張属性を削除してからコピーする場合は、 ._ ファイル(AppleDouble ファイル)は作成されません。

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

01.jpg の他に ._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  //コピーした画像ファイル

dot_clean コマンド

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

以下は dot_clean コマンドのオプションです(man dot_clean ページからの適当な直訳)。

オプション 意味
-f 配下のディレクトリに対し再帰的に削除を行わない
-h ヘルプを表示
-m 常に ._ ファイル(AppleDouble ファイル)を削除
-n 一致するネイティブファイル(分離元のファイル)がない場合は、 ._ ファイル(AppleDouble ファイル)を削除
-p ._ ファイル(AppleDouble ファイル)を残す
-s シンボリックリンクをたどります。
-v 詳細な情報を出力します。
--keep=mostrecent デフォルトのオプション。 属性がデータフォークに関連付けられている場合はそれを使用し、それ以外の場合は、AppleDouble ファイルに保存されている情報を使用
--keep=dotbar ネイティブファイルに関連付けられている拡張属性を置き換えて、常に AppleDouble ファイルに保存されている情報を使用
--keep=native AppleDouble ファイルは無視して、常にデータフォークに関連付けられた情報を使用
% dot_clean -h   return  #ヘルプを表示
usage: dot_clean  [-fhmnpsv] [--keep=[mostrecent|dotbar|native]] [directory ...]

 f : flat.	Disables recursive conversion.
 h : help.	Print this message.
 m : Always delete apple double files.
 n : Delete apple double file if there is no matching native file.
 p : Preserve apple double file
 s : Follow symbolic links.
 v : Verbose

 keep : Specify whether to keep the mostrecent, dotbar, or native.

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

-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   return 

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

% open .    return

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

% open https://webdesignleaves.com   return 

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

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

% open -e sample1.txt   return //TextEdit で sample1.txt を開く

% open sample1.txt   return //おそらく同じこと

% open -t 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\ 2022 01.jpg   return //Photoshop 2022 で 01.jpg を開く

tree ディレクトリをツリー状に表示

tree コマンドを使うと、ディレクトリやファイルをツリー状に表示することができます。

但し、MacOS にはデフォルトでは tree コマンドがインストールされていないので Homebrew などを使ってインストールする必要があります。

以下が tree コマンドの書式です。

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

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

オプション 意味
-a 「.」で始まるファイルやディレクトリも表示
-d ディレクトリだけを表示
-l(小文字のエル) シンボリックリンクをたどる
-f フルパスを付けて表示
-L level(整数) 表示するディレクトリの深さを整数で指定
-P pattern pattern(ワイルドカード)にマッチしたファイルだけを表示
-I pattern(大文字のアイ) pattern(ワイルドカード)にマッチしたファイルを表示しない
--prune 空のディレクトリを出力しない(-P や -I オプションと併用してファイルが見つからなかったディレクトリを表示しない)
-o filename filename で指定したファイルに出力(保存)
-Q ファイル名を二重引用符で囲んで表示
-p ファイルタイプとパーミッションを表示(ls -l に相当)
-u ユーザ名または UID を表示
-g グループ名または GID を表示
-s ファイルのサイズを表示
-h ファイルのサイズを読みやすい単位付きで表示
-v バージョンごとにソートして表示
-t ファイルの更新時刻順に表示
-c ファイルのステータス変更時刻順で表示
-r 逆順にソートして表示
-U ソートせずにディレクトリの順で表示(デフォルトはアルファベット順)
-H baseHREF HTML 形式で表示。baseHREF でファイルへのリンクの URL の起点を指定
-F ディレクトリの場合は「/」、ソケットファイルの場合は「=」、実行可能ファイルの場合は「*」を追加します。

ディレクトリを指定しなかった場合はカレントディレクトリを対象として表示します。

% tree    return
.             #カレントディレクトリ
├── file1.txt
├── file2.txt
└── foo
    ├── sample1.txt
    ├── sample2.txt
    └── sample3.txt

以下はディレクトリを指定する例です。

% tree /private/etc/apache2/   return
/private/etc/apache2/
├── extra
│   ├── httpd-autoindex.conf
│   ├── httpd-dav.conf
│   ├── httpd-default.conf
│   ├── httpd-info.conf
│   ├── httpd-languages.conf
│   ├── httpd-manual.conf
│   ├── httpd-mpm.conf
│   ├── httpd-multilang-errordoc.conf
│   ├── httpd-ssl.conf
│   ├── httpd-userdir.conf
│   ├── httpd-vhosts.conf
│   └── proxy-html.conf
├── httpd.conf
├── magic
├── mime.types
├── original
│   ├── extra
│   │   ├── httpd-autoindex.conf
│   │   ├── httpd-dav.conf
│   │   ├── httpd-default.conf
│   │   ├── httpd-info.conf
│   │   ├── httpd-languages.conf
│   │   ├── httpd-manual.conf
│   │   ├── httpd-mpm.conf
│   │   ├── httpd-multilang-errordoc.conf
│   │   ├── httpd-ssl.conf
│   │   ├── httpd-userdir.conf
│   │   ├── httpd-vhosts.conf
│   │   └── proxy-html.conf
│   └── httpd.conf
├── other
│   ├── mpm.conf
│   └── php7.conf
└── users

5 directories, 30 files

ファイルをパス付きで表示

-f オプションを指定すると、ファイルやディレクトリの名前をフルパスで表示します。

% tree -f /bin    return
/bin
├── /bin/[
├── /bin/bash
├── /bin/cat
├── /bin/chmod
├── /bin/cp
├── /bin/csh
・・・中略・・・
├── /bin/sh
├── /bin/sleep
├── /bin/stty
├── /bin/sync
├── /bin/tcsh
├── /bin/test
├── /bin/unlink
├── /bin/wait4path
└── /bin/zsh

0 directories, 35 files

パターンで絞り込み表示(マッチするファイルだけを表示)

-P pattern で pattern に指定したパターンにマッチするファイルだけを表示できます。パターンには *(アスタリスク)や .(ドット) などのワイルドカードが指定できます。

以下は "*.js" を指定して拡張子が「.js」にマッチするファイルを表示する例です(ファイルを含まないディレクトリを非表示にするには --prune を指定します)。

% tree -P "*.js" /Applications/MAMP/htdocs/sample_site/    return
/Applications/MAMP/htdocs/sample_site/
├── _notes
├── contact
├── css
│   ├── Archives
│   └── _notes
├── cubeportfolio
│   ├── css
│   │   └── _notes
│   ├── img
│   │   └── _notes
│   └── js
│       ├── _notes
│       ├── jquery.cubeportfolio.js
│       ├── jquery.cubeportfolio.min.js
│       ├── main.js
│       ├── main_2019.js
│       ├── main_2019DD.js
│       ├── main_2019_BTN.js
│       └── main_org_2018.js
├── fonts
・・・中略・・・
├── js
│   ├── Archives
│   │   ├── imagesloaded.pkgd.min.js
│   │   ├── jquery.bxslider.min.js
│   │   ├── jquery.easing.1.3.js
│   │   ├── jquery.lazyload.min.js
│   │   ├── jquery.magnific-popup.min.js
│   │   ├── masonry.pkgd.min.js
│   │   └── temp.js
│   ├── _notes
│   ├── base.js
│   ├── respond.min.js
│   └── utilities.js
├── libs
・・・中略・・・
47 directories, 17 files

以下は --prune を指定してファイルを含まないディレクトリを表示しないようにする例です。

% tree -P "*.js" --prune /Applications/MAMP/htdocs/sample_site/    return
/Applications/MAMP/htdocs/sample_site/
├── cubeportfolio
│   └── js
│       ├── jquery.cubeportfolio.js
│       ├── jquery.cubeportfolio.min.js
│       ├── main.js
│       ├── main_2019.js
│       ├── main_2019DD.js
│       ├── main_2019_BTN.js
│       └── main_org_2018.js
└── js
    ├── Archives
    │   ├── imagesloaded.pkgd.min.js
    │   ├── jquery.bxslider.min.js
    │   ├── jquery.easing.1.3.js
    │   ├── jquery.lazyload.min.js
    │   ├── jquery.magnific-popup.min.js
    │   ├── masonry.pkgd.min.js
    │   └── temp.js
    ├── base.js
    ├── respond.min.js
    └── utilities.js

4 directories, 17 files

パターンで絞り込み表示(マッチするファイルを除外)

-I pattern で pattern に指定したパターンにマッチするファイルを除外して表示できます。パターンには *(アスタリスク)や .(ドット) などのワイルドカードや「または」を意味する「|」が指定できます。

以下は "node_modules" を指定してファイルやディレクトリ名が「node_modules」以外のファイルやディレクトリを表示する例です。また、 -L 3 を同時に指定して、表示するディレクトリの階層の深さを 3 に指定しています。

% tree -L 3 -I "node_modules"    return //-I(アイの大文字)
.
├── package-lock.json
├── package.json
├── src
│   ├── modules
│   │   ├── bar.js
│   │   └── foo.js
│   ├── one.js
│   └── two.js
└── webpack.config.js

2 directories, 7 files

以下は 'news|_notes' を指定してファイルやディレクトリ名が「news」及び「_notes」以外のファイルやディレクトリを表示する例です。「news|_notes」 は「news または _notes」を表します。

% tree -I 'news|_notes'   return
.
├── about
│   └── index.php
├── contact
│   └── index.php
├── inc
│   ├── footer.php
│   ├── head.php
│   ├── header.php
│   ├── side.php
│   └── vars.php
├── index.php
├── js
│   └── main.js
└── products
    └── index.php

ファイルに出力 -o

-o オプションを使ってファイル名を指定すると、テキストファイルとして出力を保存することができます。

以下はデスクトップのディレクトリやファイルをツリー状に表示してデスクトップに tree.txt という名前のテキストファイルで保存する例です。出力先を ~/Desktop/tree.txt ではなく単に tree.txt とするとカレントディレクトリに出力されます。

% tree ~/Desktop -o ~/Desktop/tree.txt    return 

HTML 形式で出力

-H オプションを使って「-H baseHREF」のようにリンクの起点(baseHREF)を指定すると HTML 形式で出力することができます。

出力される HTML ではファイル名の部分が <a href="baseHREFからのパス">ファイル名</a> のようにリンクに変換されるので「baseHREF」でリンク(href 属性)の起点を指定します。

tree -H baseHREF(リンクの起点) -o filename(ファイル名) 

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

sample
└── myDir
    └── foo
        ├── bar
        │   └── sample2.txt
        └── sample.txt

-H でカレントディレクトリ「.」と -o で tree.html(ファイル名)を指定して sample ディレクトリで実行すると、

% tree -H . -o tree.html  return

以下のような HTML ファイル(tree.html)が sample ディレクトリに出力されます。

tree.html
<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="Author" content="Made by 'tree'">
 <meta name="GENERATOR" content="$Version: $ tree v2.0.1 (c) 1996 - 2022 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro $">
 <title>Directory Tree</title>
 <style type="text/css">
  BODY { font-family : monospace, sans-serif;  color: black;}
  P { font-family : monospace, sans-serif; color: black; margin:0px; padding: 0px;}
  A:visited { text-decoration : none; margin : 0px; padding : 0px;}
  A:link    { text-decoration : none; margin : 0px; padding : 0px;}
  ・・・中略(スタイル)・・・
 </style>
</head>
<body>
<h1>Directory Tree</h1><p>
    <a href="././00Tree.html/">.</a><br>
├── <a href="./myDir/00Tree.html/">myDir</a><br>
│   └── <a href="./myDir/foo/00Tree.html/">foo</a><br>
│   &nbsp;&nbsp;&nbsp; ├── <a href="./myDir/foo/bar/00Tree.html/">bar</a><br>
│   &nbsp;&nbsp;&nbsp; │   └── <a href="./myDir/foo/bar/sample2.txt">sample2.txt</a><br>
│   &nbsp;&nbsp;&nbsp; └── <a href="./myDir/foo/sample.txt">sample.txt</a><br>
└── <a href="./tree.html">tree.html</a><br>
<br><br><p>

3 directories, 3 files

</p>
<hr>
<p class="VERSION">
     tree v2.0.1 © 1996 - 2022 by Steve Baker and Thomas Moore <br>
     HTML output hacked and copyleft © 1998 by Francesc Rocher <br>
     JSON output hacked and copyleft © 2014 by Florian Sesser <br>
     Charsets / OS/2 support © 2001 by Kyosuke Tokoro
</p>
</body>
</html>

以下のようなローカル環境(MAMP)の htdocs に mySite というサイトを配置してある場合、

/Applications/MAMP/htdocs/mySite
mySite
├── about.html
├── assets
│   ├── dist
│   │   ├── fonts
│   │   │   ├── bootstrap-icons.woff
│   │   │   └── bootstrap-icons.woff2
│   │   ├── main.js
│   │   ├── main.js.map
│   │   ├── style.css
│   │   └── style.css.map
│   ├── node_modules  //多数のサブディレクトリがあるので除外する
│   ├── package-lock.json
│   ├── package.json
│   ├── src
│   │   ├── custom.scss
│   │   └── index.js
│   └── webpack.config.js
├── contact.html
├── images
│   ├── carousel_1.png
│   ├── carousel_2.png
│   ├── carousel_3.png
│   └── sample.jpg
└── index.html

http://localhost/mySite を baseHREF(リンクの起点)に指定し、node_modules ディレクトリを除外して mysite.html という名前で出力する場合は以下のように実行します。この例では h1 要素で出力されるタイトルを -T オプションで 'Sample HTML' と指定しています。

% tree -I "node_modules" -H http://localhost/mySite -T 'Sample HTML' -o mysite.html   return

以下のような HTML ファイルが /Applications/MAMP/htdocs/mySite に出力されます。

mysite.html
<!DOCTYPE html>
<html>
<head>
・・・中略・・・
 </style>
</head>
<body>
<h1>Sample HTML</h1><p> <!-- -T オプションで指定 -->
    <a href="http://localhost/mySite/./00Tree.html/">.</a><br>
├── <a href="http://localhost/mySite/about.html">about.html</a><br>
├── <a href="http://localhost/mySite/assets/00Tree.html/">assets</a><br>
│   ├── <a href="http://localhost/mySite/assets/dist/00Tree.html/">dist</a><br>
│   │   ├── <a href="http://localhost/mySite/assets/dist/fonts/00Tree.html/">fonts</a><br>
│   │   │   ├── <a href="http://localhost/mySite/assets/dist/fonts/bootstrap-icons.woff">bootstrap-icons.woff</a><br>
│   │   │   └── <a href="http://localhost/mySite/assets/dist/fonts/bootstrap-icons.woff2">bootstrap-icons.woff2</a><br>
│   │   ├── <a href="http://localhost/mySite/assets/dist/main.js">main.js</a><br>
│   │   ├── <a href="http://localhost/mySite/assets/dist/main.js.map">main.js.map</a><br>
│   │   ├── <a href="http://localhost/mySite/assets/dist/style.css">style.css</a><br>
│   │   └── <a href="http://localhost/mySite/assets/dist/style.css.map">style.css.map</a><br>
│   ├── <a href="http://localhost/mySite/assets/package-lock.json">package-lock.json</a><br>
│   ├── <a href="http://localhost/mySite/assets/package.json">package.json</a><br>
│   ├── <a href="http://localhost/mySite/assets/src/00Tree.html/">src</a><br>
│   │   ├── <a href="http://localhost/mySite/assets/src/custom.scss">custom.scss</a><br>
│   │   └── <a href="http://localhost/mySite/assets/src/index.js">index.js</a><br>
│   └── <a href="http://localhost/mySite/assets/webpack.config.js">webpack.config.js</a><br>
├── <a href="http://localhost/mySite/contact.html">contact.html</a><br>
├── <a href="http://localhost/mySite/images/00Tree.html/">images</a><br>
│   ├── <a href="http://localhost/mySite/images/carousel_1.png">carousel_1.png</a><br>
│   ├── <a href="http://localhost/mySite/images/carousel_2.png">carousel_2.png</a><br>
│   ├── <a href="http://localhost/mySite/images/carousel_3.png">carousel_3.png</a><br>
│   └── <a href="http://localhost/mySite/images/sample.jpg">sample.jpg</a><br>
├── <a href="http://localhost/mySite/index.html">index.html</a><br>
└── <a href="http://localhost/mySite/tree.html">tree.html</a><br>

・・・中略・・・
</body>
</html>

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

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

並べ替えた結果をファイルに保存

以下は並べ替えた結果をリダイレクトを使って別ファイル(sorted_sample1.txt)に保存する例です。以下の場合、指定した別ファイルが存在する場合は上書きされます。追記するのであれば > の代わりに >> を使用します。

% sort sort_sample1.txt > sorted_sample1.txt   return  //別ファイルに保存

% cat sorted_sample1.txt   return  //保存した内容を確認
1234
1k
2M
321
apple
banana
grape
orange

複数のファイルを合わせて並べ替え

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

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

% 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 オプションを使うと、並べ替えに使用する「フィールド」を指定できます。

フィールドの区切り文字のデフォルトは空白文字ですが、-t オプションで変更することができます。

以下のようなタブ区切りのテキストファイル(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 コマンドを使う際にソートする必要がある場合は、こちらを使うほうが簡単かもしれません。

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

% cat city.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 city.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 city.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 city.txt | uniq    return //sort で並び替えてから重複行を削除
Los Angels
New York
Paris
Rio De Janeiro
Tokyo

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

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

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

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

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

% cat city2.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 city2.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 city2.txt |uniq -i   return
Los Angels
New York
Paris
Rio De Janeiro
Tokyo

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

重複行だけを表示

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

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

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

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

重複回数を表示

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

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

% cat city2.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 city2.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 city2.txt | uniq -ci   return
   4 Los Angels
   4 New York
   3 Paris
   2 Rio De Janeiro
   3 Tokyo

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

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

tr 文字の置換・削除

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

以下が文字を置換する書式で、文字列1を文字列2に置換します。

tr 文字列1  文字列2

以下は文字を削除する書式で -d オプションを指定して、削除対象の文字を指定します。

tr -d 文字列

また、 -s オプションを指定すると指定した文字列が連続する場合はそれらを1つにまとめます。

tr -s 文字列

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

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

cat で表示したファイルをパイプ(|)を使って tr コマンドを適用する場合

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

リダイレクト(<)を使ってファイルを読み込んで tr コマンドを適用する場合

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

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

オプション 意味
-d 「文字列1」に含まれる文字を削除
-s 「文字列1」に含まれる文字が連続していたら、それらを1つにまとめる(繰り返される文字列を、最初の文字を除きすべて削除)

以下は「,」を「:」に置換する例です。

% cat tr_sample.txt   return //適用するファイルの内容を確認
abc,def,ghi
"ABC", "DEF", "GHI"

% cat tr_sample.txt | tr , :    return //「,」を「:」に置換(cat コマンドとパイプ)
abc:def:ghi   #置換された
"ABC": "DEF": "GHI"

% tr , : < tr_sample.txt    return //「,」を「:」に置換(リダイレクト)
abc:def:ghi   #置換された
"ABC": "DEF": "GHI"

以下は「"」を「'」に置換する例です。引数の文字列に引用符や特殊文字を指定する場合は、バックスラッシュでエスケープするか引用符で囲む必要があります。

% 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   return //適用するファイルの内容を確認
abc,def,ghi
"ABC", "DEF", "GHI"

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

スペースや改行、タブ

tr コマンドなどでは以下のような POSIX Bracket Expressions( [:class:] のような書式)やエスケープ文字が使用できます。使用する際は引用符で囲みます。

表現 意味
[:blank:] スペースとタブ 。ASCII の [ \t] に該当
[:space:] スペースやタブ、改行。ASCII の [ \t\r\n\v\f]
[:digit:] 数字。ASCII の [0-9]
[:xdigit:] 16進数。ASCII の [A-Fa-f0-9]
[:lower:] 小文字。ASCII の [a-z]
[:upper:] 大文字。ASCII の [A-Z]
[:alnum:] 英数字(アルファベットと数字)。ASCII の [a-zA-Z0-9]
[:word:] 単語(文字、数字、アンダースコア)。ASCII の [A-Za-z0-9_]
\n 改行文字(newline)
\r キャリッジリターン(carriage return)
\t タブ(tab)
\b バックスペース(backspace)
\f フォームフィード(form-feed)
\v 垂直タブ(vertical tab)

以下は POSIX Bracket Expressions やエスケープ文字を使用する例です。

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

% cat tr_sample2.txt | tr ' ' '\n'   return //半角スペースを改行に変換
abc
abc
abc
aaa
bbb
ccc

% cat tr_sample2.txt | tr ' ' '\t'  return //半角スペースをタブに変換
abc    abc    abc
aaa    bbb    ccc

% cat tr_sample2.txt | tr "[:blank:]" "\t"  return //スペース(やタブ)をタブに変換
abc    abc    abc
aaa    bbb    ccc

% cat tr_sample2.txt | tr "[:space:]" "\t"  return //スペースやタブ、改行をタブに変換
abc    abc    abc    aaa    bbb    ccc

% cat tr_sample2.txt | tr '\n' ' '  return //改行を半角スペースに変換
abc abc abc aaa bbb ccc

カンマを改行に変換

defaults domains コマンドを実行すると、カンマ区切りの値(どのようなアプリケーションがあるか)が表示されますが、以下はカンマを改行に変換して表示する例です。

% defaults domains | tr "," "\n" return
.GlobalPreferences_m
 ContextStoreAgent
 MobileMeAccounts
 ZoomChat
 com.adobe.Acrobat.Pro
 com.adobe.CSXS.11
 ・・・中略・・・
 org.mozilla.firefox
 pbs
 sharedfilelistd
 systemgroup.com.apple.icloud.searchpartyd.sharedsettings
 us.zoom.xos

複数の文字を置換

tr abc 123 を実行すると「a」を「1」に、「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 を実行すると、小文字(a-z)を大文字(A-Z)に変換することができます。また [:class:] を使って指定することもできます。

% 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

% cat tr_sample2.txt | tr '[:lower:]' '[:upper:]'  return //小文字を大文字に変換
ABC ABC ABC
AAA BBB CCC

文字を削除 -d

tr -d 文字列

-d オプションを使うと、指定した文字を削除することができます。

以下はスペースを削除する例です。

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

% cat tr_sample2.txt | tr -d " "   return //スペースを削除
abcabcabc
aaabbbccc

連続した文字や改行を1つにする -s

tr -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 コマンドはテキストファイルの行数や単語数、文字数、バイト数を数えるコマンドです。

単語は空白文字や改行文字で区切られた文字列で、行数は改行(newline)の数になります。

以下が書式です。

wc [オプション] [ファイルのパス]

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

オプション 意味
-c バイト数のみを表示
-l 改行の数(行数)のみを表示
-m 文字数のみを表示
-w 単語数のみを表示

デフォルトでは「行数」「単語数」「バイト数」及びファイル名が表示されます。

この例の場合、ファイルの行は3行あるように見えますが、最後の行の後に改行がないので2行とカウントされています。

% cat wc_sample.txt    return //対象のファイルの内容を表示
wc command
wc – word, line, character, and byte count
SYNOPSIS : wc [-clmw] [file ...]

% wc wc_sample.txt  return //オプションを指定せずに実行
  2      16      90 wc_sample.txt #2行 16単語 90バイト

以下はワイルドカードを使って複数のファイルを指定した例です。複数のファイルを指定すると、各ファイルのカウントに加え、合計(total)が表示されます。

% wc *.txt
      12      22     114 city.txt
      16      28     146 city2.txt
       8      12      65 city3.txt
       8       8      41 sample.txt
       8       8      41 sort_sample1.txt
       3       3      24 sort_sample2.txt
       5      15      83 sort_sample3.txt
       8       8      41 sorted_sample1.txt
       2       4      32 tr_sample.txt
       2       6      24 tr_sample2.txt
       9       3      19 tr_sample3.txt
       2      16      90 wc_sample.txt
      83     133     720 total  #合計

文字数を数える

文字数を数える場合は -m オプションを使用します。

単語数も一緒に表示する場合は -w オプションを、行数も一緒に表示する場合は -l オプションを同時に指定します。

% wc -m wc_sample.txt  return //文字数(-m)を表示
      88 wc_sample.txt

% wc -mw wc_sample.txt  return //単語数(-w)と文字数(-m)を表示
      16      88 wc_sample.txt

% wc -mwl wc_sample.txt  return //行数(-l)、単語数(-w)、文字数(-m)を表示
       2      16      88 wc_sample.txtt

個別に行数(-l)、単語数(-w)、文字数(-m)、バイト数(-c)を表示するには、それぞれのオプションを個別に指定します。

 % wc -l wc_sample.txt    return //行数
       2 wc_sample.txt

% wc -w wc_sample.txt    return //単語数
      16 wc_sample.txt

% wc -m wc_sample.txt    return //文字数
      88 wc_sample.txt

% wc -c wc_sample.txt    return //バイト数
      90 wc_sample.txt

以下は cat とパイプで標準入力からの読み込みをカウントする例です。

% cat | wc   return
abcdefg   #文字を入力して改行
123 456   #文字を入力して改行
#control + d を押して cat を終了
       2       3      16   #カウント

以下は、ls コマンドと grep コマンドで拡張子が .txt のファイルを1行ずつ表示して、wc コマンドと組み合わせてファイル数を数える例です。ls コマンドのオプション -1 は数字の1で、1ファイル1行で出力するオプションです。

% ls -1 | grep ".txt" | wc -l  return
  12  #カレントディレクトリには12のテキストファイルがある

以下は find コマンドを使って前述と同様のことを実行する例です。

% find . -maxdepth 1 -type f | grep ".txt" |wc -l    return
  12

grep テキストファイルの検索

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  #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 ファイル名
% grep -i -e 'a' -e 'b' personal_info.txt
玉井 泰智,男,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
森下 絢子,女,1986年09月23日,32,A
岸田 大瑚,男,1987年10月31日,31,A

複数の検索文字を検索(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
男

% 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  #-E オプションを指定
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

diff ファイルを比較して差分を表示

diff コマンドを使うと2つのテキストファイルを比較して差分(異なる箇所)を出力することができます。

以下が書式です。

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

以下は diff コマンドで指定できるオプションです。

diff コマンドのオプション(一部抜粋)
オプション 意味
-a ファイルを強制的にテキストと見なして1行ずつ比較
-b スペース数の違いは無視
-B 空行の有無(違い)は無視
-c context 形式で出力(差分をファイルごとに出力し !記号で差異を示す)
-C 行数 前後に出力する行数を指定して context 形式で出力(デフォルトは3)
-i 大文字と小文字を区別しない
-q ファイルが異なるかのみをチェック(同一の場合は結果を出力しない)
-r ディレクトリを比較する時にサブディレクトリも再帰的に比較
-s 2つのファイルが同一の場合も出力
-u unified 形式で出力(違いのある部分を1つにまとめて-記号と+記号で差異を示す)
-U 行数 前後に出力する行数を指定して unified 形式で出力(デフォルトは3)
-w 空白(white space)を全て無視して比較
-W 幅 side-by-side 形式で出力する幅(文字数)を指定
-y side-by-side 形式(2列)で出力

以下は2つのファイル file1.txt と file2.txt を比較して差異を表示する例です。

結果の「2c2」は差異の位置を表し、file1.txt の2行目が比較する file2.txt の2行目に変更(c: changed)されていることを示しています。

続いて差異の部分の 「< file1.txt の内容」、「> file2.txt の内容」が表示されています。

% cat file1.txt   return # file1.txt の内容
123
abc
def

% cat file2.txt    return # file2.txt の内容
123
abcx
def

# file1.txt に対する file2.txt の差分を表示
% diff file1.txt file2.txt   return  # 差異を表示
2c2
< abc  # file1.txt の該当箇所
---
> abcx  # file2.txt の該当箇所

以下は、前述の例と同じ file1.txt と、1行目に空行と5行目に「456」の文字を追加した file2.txt を比較する例です。

結果の「0a1」は差異の位置を表し、file1.txt の0行目が比較する file2.txt の1行目に追加(a: added)されていることを示しています。

% cat file1.txt    return # file1.txt の内容
123
abc
def

% cat file2.txt     return # file2.txt の内容(1行目に空行、5行目に文字を追加)
         # 1行の空行
123
abcx
def
456

% diff file1.txt file2.txt   return  # 差異を表示
0a1   # file1.txt の0行目と file2.txt の1行目 (a: added)
>  # file2.txt の該当箇所(空行)
2c3   # file1.txt の2行目と file2.txt の3行目 (c: changed)
< abc  # file1.txt の該当箇所
---
> abcx  # file2.txt の該当箇所
3a5   # file1.txt の3行目と file2.txt の5行目 (a: added)
> 456  # file2.txt の該当箇所

以下は、前述の例と同じ file1.txt と、いくつかの行を削除した file2.txt を比較する例です。

結果の「2d1」は差異の位置を表し、file1.txt の2行目が削除(d: deleted)され、file2.txt の以降のテキストが1行の直後まで詰められていることを示しています。

% cat file1.txt    return # file1.txt の内容
123
abc
def

% cat file2.txt     return # file2.txt の内容
123
def

% diff file1.txt file2.txt    return  # 差異を表示
2d1  # file1.txt の2行目が削除され、file2.txt の1行目に詰められている(d: deleted)
< abc  # file1.txt の該当箇所

side-by-side 形式(2列)で出力

-y オプションを使うと比較するテキストファイルを2列(side-by-side 形式)で表示し差分を記号で示すことができます。

diff -y ファイル1 ファイル2

以下の記号で異なる部分を示します。

記号 意味
| 異なる部分(行)を示す
< ファイル1にしか存在しない行を示す
> ファイル2にしか存在しない行を示す

以下は side-by-side 形式で出力する例です。実際の出力は各列がもっと離れて表示されます(-W オプションで調整可能)。

% cat file1.txt     return # file1.txt の内容
123
abc
def

% cat file2.txt      return # file2.txt の内容
123
abcx
def
456

% diff -y file1.txt file2.txt    return  # side-by-side 形式(2列)で出力
123    123
abc    |abcx   #異なる部分(行)
def    def
       >456    #ファイル2にしか存在しない行

以下のオプションを指定することができます。

オプション 意味
--left-column 共通な行は左側の列にのみ表示
--suppress-common-lines 共通な行は非表示
% cat file1.txt  return # file1.txt の内容
123
abc
def

% cat file2.txt   return # file2.txt の内容
123
abcx
def
456

% diff -y --left-column file1.txt file2.txt  return #共通な行は左側の列にのみ表示
123    (       #共通な行
abc    | abcx  #異なる行
def    (       #共通な行
       > 456   #ファイル2にしか存在しない行

% diff -y --suppress-common-lines file1.txt file2.txt  return #共通な行は表示しない
abc    | abcx
       > 456

-W オプション(幅の指定)

-W オプションを指定すると、指定した幅に合わせて表示することができます。例えば横幅が80文字の端末なら「-W 80」のように指定します。以下は横幅を40文字で表示する例です。

% diff -y  -W 40 --suppress-common-lines file1.txt file2.txt   return

context 形式で出力

-c オプションを使うと比較するテキストファイルの差分を contex 形式で出力することができます。

contex 形式では差分を前後の行を含めて別々に出力します。

diff -c ファイル1 ファイル2 
diff -C 行数 ファイル1 ファイル2

出力の先頭には「***」に続いて1つ目のファイル名、「---」に続いて2つ目のファイル名が表示されます。

その後に「*** 1つ目のファイルの開始行番号, 終了行番号 ***」のように該当箇所の位置が表示され、2つ目のファイルとの差分の内容とその前後の行が表示されます。

続いて「--- 2つ目のファイルの開始行番号, 終了行番号 ---」が表示され、1つ目のファイルとの差分の内容とその前後の行が表示されます。

差分のある行の行頭には「!」、追加されている行の行頭には「+」、削除されている行の行頭には「-」が表示されます。

記号 意味
! 差分のある(内容が異なる)行
+ 追加されている行
- 削除されている(存在しない)行

表示される差分の前後の行数はデフォルトでは3行ですが、-c の代わりに -C 行数 オプションを使うと前後に表示する行数を変更することができます。

% cat file1.txt   return # file1.txt の内容
123
abc
def

% cat file2.txt  return # file2.txt の内容
123
abcx
def
456

% diff -c file1.txt file2.txt   return # context 形式で出力
*** file1.txt	2020-02-09 10:09:26.000000000 +0900 # 1つ目のファイル名
--- file2.txt	2020-02-09 11:24:25.000000000 +0900 # 2つ目のファイル名
***************
*** 1,3 ****   # 1つ目のファイルの開始行番号, 終了行番号(該当箇所の位置)
  123
! abc   #内容が異なる行
  def
--- 1,4 ----   # 2つ目のファイルの開始行番号, 終了行番号(該当箇所の位置)
  123
! abcx   #内容が異なる行
  def
+ 456   #追加された行

前述の例ではファイル全体でも4行しかないので前後の行として全てが表示されますが、以下は行数の多いファイルを比較した例です。該当箇所の前後の行が表示されます。

% cd /Applications/MAMP/conf/apache  return

% diff -c httpd.conf httpd.conf.org   return //ファイルを比較
*** httpd.conf	2020-02-08 19:09:58.000000000 +0900  # 1つ目のファイル名
--- httpd.conf.org	2020-02-08 16:08:06.000000000 +0900 # 2つ目のファイル名
***************
*** 572,578 **** # 1つ目のファイルの開始行番号, 終了行番号(572行目から578行目)
  #Include /Applications/MAMP/conf/apache/extra/httpd-info.conf

  # Virtual hosts
! Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf   #内容が異なる行

  # Local access to the Apache HTTP Server Manual
  #Include /Applications/MAMP/conf/apache/extra/httpd-manual.conf
--- 572,578 ----   # 2つ目のファイルの開始行番号, 終了行番号(572行目から578行目)
  #Include /Applications/MAMP/conf/apache/extra/httpd-info.conf

  # Virtual hosts
! #Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf   #内容が異なる行

  # Local access to the Apache HTTP Server Manual
  #Include /Applications/MAMP/conf/apache/extra/httpd-manual.conf

unified 形式で出力

-u オプションを使うと比較するテキストファイルの差分を unified 形式で出力することができます。

unified 形式では差分を1つ目のファイルの内容と2つ目の内容を合わせた状態で出力します。

diff -u ファイル1 ファイル2 
diff -U 行数 ファイル1 ファイル2

出力の先頭には「---」に続いて1つ目のファイル名、「+++」に続いて2つ目のファイル名が表示されます。

その後に「@@ -1つ目のファイルの開始行, 表示行数 +2つ目のファイルの開始行,表示行数 @@」のように該当箇所の位置が表示され、差分の内容が表示されます。

異なっている箇所には「-」または「+」記号が出力されます。

記号 意味
- 1つ目のファイルを意味します
+ 2つ目のファイルを意味します
% cat file1.txt   return # file1.txt の内容
123
abc
def

% cat file2.txt  return # file2.txt の内容
123
abcx
def
456

% diff -u file1.txt file2.txt   return # unified 形式で出力
--- file1.txt	2020-02-09 10:09:26.000000000 +0900  # 1つ目のファイル名
+++ file2.txt	2020-02-09 11:24:25.000000000 +0900  # 2つ目のファイル名
@@ -1,3 +1,4 @@  # file1.txtの1〜3行目、 file2.txtの1〜4行目
 123
-abc   # 1つ目のファイル(file1.txt)
+abcx   # 2つ目のファイル(file2.txt)
 def
+456   # 2つ目のファイル(file2.txt)

ディレクトリ単位でファイルを比較

ディレクトリを指定して、2つのディレクトリにある同名のファイル同士を比較することができます。

サブディレクトリを再帰的に比較する場合は -r オプションを指定します。

diff ディレクトリ1 ディレクトリ2
diff -r ディレクトリ1 ディレクトリ2   (再帰的に比較)

以下は2つのディレクトリ bar と foo にあるファイルを比較する例です。

% diff -c bar foo  return #context 形式で出力
diff -c bar/sample1.txt foo/sample1.txt # sample1.txt の比較結果
*** bar/sample1.txt	2019-09-05 17:11:30.000000000 +0900
--- foo/sample1.txt	2020-02-09 13:53:42.000000000 +0900
***************
*** 2,8 ****   #bar/sample1.txtの2〜8行目
  -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
  -r-xr-xr-x    1 root   wheel    1990640  5  4 14:26 db_deadlock
- -r-xr-xr-x    1 root   wheel    1994816  5  4 14:26 db_dump   #差分
  -r-xr-xr-x    1 root   wheel    2003152  5  4 14:26 db_hotbackup
  -r-xr-xr-x    1 root   wheel    2015840  5  4 14:26 db_load
  -r-xr-xr-x    1 root   wheel    2066192  5  4 14:26 db_printlog
--- 2,7 ----
diff -c bar/sample3.txt foo/sample3.txt # sample3.txt の比較結果
*** bar/sample3.txt	2019-09-05 17:11:30.000000000 +0900
--- foo/sample3.txt	2020-02-09 13:54:26.000000000 +0900
***************
*** 61,67 ****  #bar/sample3.txtの61〜67行目
  Hello
  My World! some more text.

!               #差分
  -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
--- 61,67 ----   #foo/sample3.txtの61〜67行目
  Hello
  My World! some more text.

! -r-xr-xr-x    1 root   wheel    1986480  5  4 14:26 db_archive  #差分
  -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

ファイルに違いがあるかどうかだけを出力

-q オプションを使うと、ファイルの内容(差分)は表示せずにファイルに違いがあるかどうかだけを出力できます。

以下は MAMP の異なるバージョンの conf ディレクトリを比較する例です( -r は再帰的に比較)。

表示 意味
Files 差分があるファイルを表示
Only in どちらかにのみ存在するファイルを示す
% diff -q -r conf conf_org  return
Files conf/.DS_Store and conf_org/.DS_Store differ  #差分があるファイル
Only in conf_org: SQLiteManager  # conf_org にのみ存在するファイル
Files conf/apache/.DS_Store and conf_org/apache/.DS_Store differ #差分があるファイル
Only in conf/apache/extra: .DS_Storer  # conf/apache/extra にのみ存在するファイル
Only in conf/apache/extra: httpd-vhosts.conf.org
Files conf/apache/httpd.conf and conf_org/apache/httpd.conf differ
Only in conf/apache: httpd.conf.org
Files conf/nginx/nginx.conf and conf_org/nginx/nginx.conf differ
Only in conf: php7.1.31
Only in conf: php7.1.32
Only in conf: php7.2.21
Only in conf: php7.2.22
Files conf/php7.3.0/php.ini and conf_org/php7.3.0/php.ini differ
Files conf/php7.3.1/php.ini and conf_org/php7.3.1/php.ini differ
Files conf/php7.3.3/php.ini and conf_org/php7.3.3/php.ini differ
Files conf/php7.3.7/php.ini and conf_org/php7.3.7/php.ini differ
Only in conf: php7.3.8
Only in conf: php7.3.9
Only in conf: php7.4.1

リダイレクトとパイプ

リダイレクトやパイプを使うと、コマンドの出力をファイルに保存したり別のコマンドに渡したりすることができます。

例えば、dmesg コマンドは起動時のシステムのメッセージ(カーネルが出力したメッセージ)のバッファを表示するコマンドですが、大きなメッセージのためそのまま実行すると見やすくありません。

1画面ずつ停止しながらメッセージを表示するには、パイプ(|)を使って dmesg コマンドの出力を less コマンドに渡して見ることができます。

dmesg コマンドは root で実行する必要があるため sudo を使います(以下を実行するとパスワードを聞かれます)。

less を使って表示されるので、キー操作を使って内容を確認できます。

% sudo dmesg | less -N  return

Password:  #Mac のパスワードを入力

#less を使ってバッファが表示される
1 [1] outputBelowExpected:0 outputBelowInput:0 lowTxFrameCount:1 queueFull:0 highLa      1 tency:0 baselineNotAllowed:0 highSymptomsFails:0
2 [168726.866976]: LQM-WIFI: slow-wifi TxLim[1] lowPhyRate:0 lowPhyRateTputRatio:0       2 highPER:0 highRetries:0 lowTxAMPDUDensity:0 lowCCA:1 activeCoex:0 hostFWMismatch:      2 0
3 [168726.866996]:
・・・以下省略・・・

また、例えば 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 と入力し return を押すと入力した文字が出力される
test
control + d //control + d を押して cat コマンド終了

% cat < sample.txt   return //リダイレクトでファイルから読み込み出力
This is sample text.  #ファイルの内容が出力される
abcdefg

//但し、cat コマンドは引数にファイルを指定できるので、以下と同じこと
% cat sample.txt   return
This is sample text.
abcdefg

cat コマンドの場合は引数にファイルを指定できるので意味がありませんが、例えば、tr コマンドはフィルタとして使用されることを前提にしたコマンドで、引数にファイルを指定することができません。

そのような場合は、リダイレクトを使ってファイルを読み込むことができます(パイプを使って別のコマンドの実行結果を渡すこともできます)。

% tr abc 123 < sample.txt  return //リダイレクトを使って sample1.txt を読み込む
This is s1mple text.
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 //空なので何も表示されない

リダイレクトによる上書き禁止

デフォルトでは、標準出力のリダイレクト(>)先を既存ファイルにした場合、警告なしで上書きされます。

「set -o noclobber」または「set -C」を実行すると上書きを禁止することができます。

% set -C  return //または set -o noclobber
% cat > sample.txt   return
zsh: file exists: sample.txt  //上書きできない

「>」の代わりに「>|」を使用すれば、強制的に上書きすることができます。

% cat >| sample.txt return //禁止状態でも上書き可能

「set +o noclobber」または「set +C」を実行すれば上書きすることができます(またはターミナルを再起動しても上書き禁止は解除されます)。

% cat > sample.txt  return
zsh: file exists: sample.txt //上書きできない

% set +C  return //上書き禁止を解除(または set +o noclobber)

% cat > sample.txt return //上書き可能

既存ファイルに追加(>>)

既存のファイルに追加する場合は出力先ファイルを >> で指定します。指定したファイルが存在しない場合は新規作成になります。

コマンド >> ファイルのパス

以下は、echo コマンドの出力(additional text)を sample.txt というファイルの最後に追加する例です。

% cat sample.txt  return  //現在の内容を確認
this is sample text.

% echo "additional text" >> sample.txt  return  //追記

% cat sample.txt  return  //内容を確認
this is sample text.
additional text  #追記されている

以下は、tail コマンドで取得する system.log の最後の3行を既存ファイル sample.txt の最後に追加する例です。

% tail -3 /var/log/system.log >> sample.txt return

% cat sample.txt  return
this is sample text.
additional text
Jan 23 15:37:07 iMac login[22073]: USER_PROCESS: 22073 ttys000  #追記
Jan 23 15:45:17 iMac syslogd[116]: ASL Sender Statistics  #追記
Jan 23 15:57:45 iMac syslogd[116]: ASL Sender Statistics  #追記

エラー出力をリダイレクト(2>)

UNIX 系 OS では標準入力は「0」、標準出力は「1」、標準エラー出力は「2」の番号(ファイルディスクリプタ)が割り当てられています。

ファイルディスクリプタ(FD/File Descriptor)は入出力装置やファイルなどの入出力インターフェースを識別するために使われる番号で、デフォルトでは以下が設定されています。

ファイルディスクリプタ 出力先 設定先
0 標準入力(stdin) キーボード
1 標準出力(stdout) 画面
2 標準エラー出力(stderr) 画面

標準エラー出力をリダイレクトする場合は 2> と指定します。

例えば find コマンドで検索をすると、ディレクトリにアクセス権がない場合などにエラーが出力されます。

% find . -name sample.txt return
./Desktop/sample/myDir/foo/sample.txt
./Desktop/sample/sample.txt
find: ./Library/.../CallHistoryTransactions: Operation not permitted #エラー
find: ./Library/.../CloudDocs/session/db: Operation not permitted #エラー
find: ./Library/.../com.apple.sharedfilelist: Operation not permitted #エラー
find: ./Library/.../Knowledge: Operation not permitted #エラー
find: ./Library/.../com.apple.TCC: Operation not permitted #エラー
find: ./Library/.../FileProvider: Operation not permitted #エラー
find: ./Library/.../AddressBook: Operation not permitted #エラー
・・・以下省略・・・

以下はエラーメッセージを error.txt というファイルにリダイレクトして保存する例です。

% find . -name sample.txt 2> ./Desktop/sample/error.txt return
./Desktop/sample/myDir/foo/sample.txt
./Desktop/sample/sample.txt

% cat ./Desktop/sample/error.txt	 return //保存されたエラーメッセージを表示
find: ./Library/.../CallHistoryTransactions: Operation not permitted #エラー
find: ./Library/.../CloudDocs/session/db: Operation not permitted #エラー
find: ./Library/.../com.apple.sharedfilelist: Operation not permitted #エラー
find: ./Library/.../Knowledge: Operation not permitted #エラー
find: ./Library/.../com.apple.TCC: Operation not permitted #エラー
find: ./Library/.../FileProvider: Operation not permitted #エラー
find: ./Library/.../AddressBook: Operation not permitted #エラー
・・・以下省略・・・

以下は実行結果を log.txt に、エラーメッセージを error.txt に別々に保存する例です。

標準出力であることを明示する場合は 1> と指定することができます。

% find . -name sample.txt 1> log.txt 2> error.txt   return 

追記する場合は 2>> や 1>> を使います。

% find . -name sample.txt 1>> log.txt 2>> error.txt   return

標準出力と標準エラーを合わせてファイルに切り替え(&>)

「標準出力」と「標準エラー出力」の出力を合わせて保存する場合は、&> を使います。

% find . -name sample.txt &> all_log.txt   return

標準エラー出力は表示しない

エラーメッセージを表示しない場合は 2> /dev/null と指定して標準エラーメッセージを /dev/null(null デバイス)へリダイレクトします。

null デバイスは特別なファイルで、null デバイスへの出力は全て破棄され、どこにも出力されず、保存もされません。

% find . -name sample.txt 2> /dev/null   return  //エラー出力は表示しない
./Desktop/sample/myDir/foo/sample.txt
./Desktop/sample/sample.txt

標準出力も標準エラー出力も不要な場合

出力が必要ない場合(シェルスクリプトで条件式に test コマンド以外のコマンドを指定した場合など)は以下のように「>/dev/null 2>&1」と指定して全ての出力を捨てることができます。

2>&1 は標準エラー出力(2)を標準出力(1)と同じ所(以下の場合は /dev/null)へリダイレクトするという意味になります。

% find . -name sample.txt >/dev/null 2>&1

# 以下と同じことです。
% find . -name sample.txt >/dev/null 2>/dev/null

# 以下でも同じことです。(&> は標準出力と標準エラーを合わせて切り替え)
% find . -name sample.txt &>/dev/null
特別なファイルパス
パス 意味
/dev/null null デバイス(不要な出力を捨てたり、空の入力として使える)
/dev/fd/n ファイルディスクリプタ n で識別されるデバイス
/dev/stdin 標準入力
/dev/stdout 標準出力
/dev/stderr 標準エラー出力

以下はそれぞれのパスを ls コマンドで確認した例です。

% ls -l /dev/null   return  # null デバイス
crw-rw-rw-  1 root  wheel  0x3000002  1 23 16:39 /dev/null

% ls -l /dev/stdin   return  # stdin 標準入力
lr-xr-xr-x  1 root  wheel  0  1 21 16:04 /dev/stdin -> fd/0

% ls -l /dev/stdout   return  # stdout 標準出力
lr-xr-xr-x  1 root  wheel  0  1 21 16:04 /dev/stdout -> fd/1

% ls -l /dev/stderr   return  # stderr 標準エラー出力
lr-xr-xr-x  1 root  wheel  0  1 21 16:04 /dev/stderr -> fd/2

% ls -l /dev/fd/0   return  # fd/0 標準入力
crw--w----  1 foo  tty  0x10000000  1 23 16:41 /dev/fd/0

% ls -l /dev/fd/1   return  # fd/1 標準出力
crw--w----  1 foo  tty  0x10000000  1 23 16:42 /dev/fd/1

% ls -l /dev/fd/2   return  # fd/2 標準エラー出力
crw--w----  1 foo  tty  0x10000000  1 23 16:42 /dev/fd/2

パイプ

パイプを使うと、コマンドの標準出力を別のコマンドの標準入力につなげることができ、複数のコマンドを組み合わせて実行することができます。

言い換えると、あるコマンドの実行結果を別のコマンドに渡して実行することができます。

パイプを使用するには、コマンドとコマンドの間に「|」を記述します。

コマンド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 で「DEAD_PROCESS」という文字列を含む行を grep コマンドで検索してリダイレクトを使ってカレントディレクトリに system_log.txt という名前で保存する例です。

% cat /var/log/system.log | grep "DEAD_PROCESS" > ./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
24106 ttys000    0:00.16 -zsh
24785 ttys000    0:00.00 tee process.txt

% cat process.txt    return
  PID TTY           TIME CMD
24106 ttys000    0:00.16 -zsh
24785 ttys000    0:00.00 tee process.txt

以下は /usr/bin の一覧結果を bin_list.txt というファイルに保存しつつ、less コマンドで表示する例です。

% ls -al /usr/bin |tee bin_list.txt | less   return

複数のファイルに保存

「コマンド | 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   2092144 12  8 08:39 db_archive
-r-xr-xr-x     1 root   wheel   2092208 12  8 08:39 db_checkpoint
-r-xr-xr-x     1 root   wheel   2125008 12  8 08:39 db_codegen
-r-xr-xr-x     1 root   wheel   2092208 12  8 08:39 db_deadlock
-r-xr-xr-x     1 root   wheel   2092256 12  8 08:39 db_dump
-r-xr-xr-x     1 root   wheel   2092368 12  8 08:39 db_hotbackup
-r-xr-xr-x     1 root   wheel   2109056 12  8 08:39 db_load
-r-xr-xr-x     1 root   wheel   2159472 12  8 08:39 db_printlog
-r-xr-xr-x     1 root   wheel   2092272 12  8 08:39 db_recover
-r-xr-xr-x     1 root   wheel   2092128 12  8 08:39 db_stat
-r-xr-xr-x     1 root   wheel   2092144 12  8 08:39 db_upgrade
-r-xr-xr-x     1 root   wheel   2092160 12  8 08:39 db_verify

% cat 01.txt   return  //内容を確認(上記と同じ)
-r-xr-xr-x     1 root   wheel   2092144 12  8 08:39 db_archive
・・・中略・・・
-r-xr-xr-x     1 root   wheel   2092160 12  8 08:39 db_verify

% diff 01.txt 02.txt   return  //01.txt と 02.txt を比較(同じ)

xargs コマンドの引数に渡す

xargs コマンドは標準入力やファイルからリスト(1つまたは複数の文字列)を読み込み、それらを指定したコマンドの引数に渡してそのコマンドを実行します。

以下が書式です。

xargs [オプション] コマンド

以下は xargs コマンドのオプションです。

オプション 意味
-0(数字のゼロ) 入力を空白や改行ではなく NULL 文字で区切る
-I replstr(置換文字列) 指定したコマンドの引数に replstr が示す置換文字列が含まれていればその位置に標準入力から読み込んだ行の内容を挿入(引数の位置を変更)
-L number(行数) 1 コマンドラインにつき最大 n 行の入力行を使用する
-p 実行前にコマンドラインをプロンプトとして表示してユーザーの入力を待つ

例えばあるコマンドの出力をパイプ(|)で xargs コマンドに送り、別のコマンドの引数として渡して実行すると言うような使い方ができます。

以下は「コマンドA」の実行結果を引数にして別の「コマンドB」を実行する書式です。

コマンドA | xargs コマンドB

以下は find コマンドを使って ./sample ディレクトリ以下の拡張子が .txt のファイルを検索して、その結果を ls コマンドに -l オプションを指定して表示する例です。

% find ./sample -name "*.txt" | xargs ls -l  return
-rw-r--r--  1 foo  staff  114  1 22 11:30 ./sample/city.txt
-rw-r--r--@ 1 foo  staff    0  1 23 16:28 ./sample/error.txt
-rw-r--r--@ 1 foo  staff   12  1 23 11:12 ./sample/file1.txt
-rw-r--r--@ 1 foo  staff   36  1 23 16:28 ./sample/log.txt
-rw-r--r--@ 1 foo  staff  235  1 23 16:01 ./sample/sample.txt

上記は以下の find コマンドの結果(ファイルのパス)を ls コマンドに引数として渡しています。

% find ./sample -name "*.txt"  return
./sample/city.txt
./sample/file1.txt
./sample/log.txt
./sample/error.txt
./sample/sample.txt

find コマンドに -exec アクションを使って以下のようにしても同じ結果が得られます。

% find ./sample -name "*.txt" -exec ls -l {} \;  return
-rw-r--r--  1 foo  staff  114  1 22 11:30 ./sample/city.txt
-rw-r--r--@ 1 foo  staff  12  1 23 11:12 ./sample/file1.txt
-rw-r--r--@ 1 foo  staff  36  1 23 16:28 ./sample/log.txt
-rw-r--r--@ 1 foo  staff  0  1 23 16:28 ./sample/error.txt
-rw-r--r--@ 1 foo  staff  235  1 23 16:01 ./sample/sample.txt

コマンド置換を使っても上記と同様のことが可能です。

スペースを含む名前がある場合 (-0 オプション)

xargs コマンド使用する際に、渡される引数の値にスペースが含まれる(スペースを含む名前がある)場合はエラーになる可能性があります。

前述の find コマンドを使って検索結果を ls コマンドに渡す場合、ファイル名などにスペースがあると区切り文字として解釈されて分割されてしまいエラーになります。

例えば、sample copy.txt というスペースを含むファイルがあると以下のように ls コマンドには sample と copy.txt という2つの引数と解釈されてエラーになります(スペースは複数の引数の区切り文字)。

% find ./sample -name "*.txt" | xargs ls -l  return
ls: ./sample/bar/sample: No such file or directory #sample ディレクトリと解釈されエラー
ls: copy.txt: No such file or directory #copy.txt と解釈されエラー
-rw-r--r--  1 foo  staff  114  1 22 11:30 ./sample/city.txt
-rw-r--r--@ 1 foo  staff    0  1 23 16:28 ./sample/error.txt
・・・

xargs コマンドに -0 オプションを指定することで xargs コマンドに NULL 文字を区切り文字として判定するようにすることができます。

そして、同時に引数を渡す側の find コマンドも -print0 オプションを指定して検索結果を NULL 区切りのフルパスで出力するようにすればエラーにならないようにすることができます。

% find ./sample -name "*.txt" -print0 | xargs -0 ls -l   return
-rw-r--r--@ 1 foo  staff   91  1 23 13:59 ./sample/bar/sample copy.txt
-rw-r--r--  1 foo  staff  114  1 22 11:30 ./sample/city.txt
-rw-r--r--@ 1 foo  staff    0  1 23 16:28 ./sample/error.txt
・・・		

コマンドを確認して実行 -p

-p オプションを指定すると、実行前に xargs コマンドが作成したコマンドを確認することができます。

y または Y をユーザーが入力して return キーを押すと実行されます。

% find ./sample -name "*.txt" | xargs -p ls -l return
#実行するコマンドが表示される
ls -l ./sample/file2.txt ./sample/city.txt ./sample/file1.txt ./sample/log.txt ./sample/foo/sort_sample2.txt ./sample/error.txt ./sample/sample.txt?...y  return //yを押して return で実行
-rw-r--r--  1 foo  staff  114  1 22 11:30 ./sample/city.txt
-rw-r--r--@ 1 foo  staff    0  1 23 16:28 ./sample/error.txt
...

1行ずつコマンドを実行 -L

-L オプションで 1 コマンドラインにつき使用する最大の入力行を指定することができます。

以下のように -p オプションを同時に指定することで1行ずつコマンドを確認しながら実行することができます。

実行しない場合は return キーを押し、実行する場合は y を押して return キーを押します。

% find ./sample -name "*.txt" | xargs -p -L1 ls -l return
ls -l ./sample/file2.txt?...  return
ls -l ./sample/city.txt?...   return
ls -l ./sample/file1.txt?...  return
ls -l ./sample/log.txt?...y   #y を押して return //実行
-rw-r--r--@ 1 foo  staff  36  1 23 16:28 ./sample/log.txt
ls -l ./sample/foo/sort_sample2.txt?...  return
ls -l ./sample/bar/wc_sample.txt?...     return
ls -l ./sample/error.txt?...y  #y を押して return //実行
-rw-r--r--@ 1 foo  staff  0  1 23 16:28 ./sample/error.txt
ls -l ./sample/sample.txt?... return

置換文字 -I

-I オプション(大文字の i)を使って置換文字を指定することができます。-I replstr のように指定します。replstr(置換文字列)は任意の文字列を指定できますが、%{} がよく使われるようです。

コマンドA | xargs -I replstr コマンドB replstr 

例えば、上記のように指定すると、コマンドAの実行結果が1つずつコマンドBの引数に渡されます

以下は echo コマンドの引数の前後に文字( "[" と "]")を挿入して出力する例です。

% find ./sample -name "*.txt" | xargs -I % echo "[" % "]"
[ ./sample/file2.txt ]
[ ./sample/city.txt ]
[ ./sample/file1.txt ]
[ ./sample/log.txt ]
・・・

以下は検索したテキストファイルをカレントディレクトリに1つずつ確認しながらコピーする例です。

% find ./sample -name "*.txt" | xargs -p -L 1 -I % cp % .  return
cp ./sample/file2.txt .?...
cp ./sample/city.txt .?...
cp ./sample/file1.txt .?...
cp ./sample/log.txt .?...y   # コピーする場合は y を押して return
cp ./sample/foo/sort_sample2.txt .?...
・・・

置換文字 -J

-J オプションを使っても置換文字を指定することができますが、-I とは異なります。

以下の場合、% が find から渡される全てのファイル名に置き換えられます。

% find ./sample -name "*.txt" | xargs -J % echo "[" % "]" return
[ ./sample/file2.txt ./sample/city.txt ./sample/file1.txt ./sample/log.txt ./sample/foo/sort_sample2.txt ./sample/bar/wc_sample.txt ./sample/error.txt ./sample/sample.txt ]

以下は検索したテキストファイルを ./sample/copy にまとめてコピーする例です。

% find ./sample -name "*.txt" | xargs -J % cp % ./sample/copy return

コマンド置換 $( )

シェルの機能のコマンド置換(command substitution)を使うと、コマンド名をコマンドの出力で置き換えることができます。

言い換えると、コマンド名で指定したコマンドの実行結果(標準出力)を別のコマンドの引数として使用することができます。

以下が書式です。

$(コマンド)

または以下のようにバッククォートで囲みます(sh から引き継いだ古い書式 = 互換性を考慮した書式)。

`コマンド` 

以下は、現在のユーザー名を表示するコマンド whoami をコマンド置換を使って echo コマンドの引数にする例です。

echo コマンドの引数はコマンドを展開するのでダブルクォートで囲む必要があります(シングルクォートを使うとそのまま文字列として出力されます)。

% echo "現在のユーザ:$(whoami)"   return
現在のユーザ:foo  //コマンドを実行したユーザーが foo の場合 

以下は find コマンドの実行結果を ls コマンドに渡して実行する例です。

% ls -l $(find ./sample -name "*.txt")

//xargs を使って以下のようにしても同じ結果
% find ./sample -name "*.txt" | xargs ls -l

また、コマンド置換は入れ子にすることができます。

以下は前述と同じ内容ですが、find コマンドの引数にもコマンド置換を使って入れ子にしています。

% ls -l $(find ./sample -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  //zsh では少数も使えます(bash ではエラー)
3.1000000000000001
//bash の場合は、少数を指定するとエラーが表示され展開されません
//-bash: 1.1 + 2: syntax error: invalid arithmetic operator (error token is ".1 + 2")

0x または 0X で始まる整数は16進数と解釈されます。n#数値の形式で記述するとn進数と解釈されます。

bash では 0 から始まる整数は 8 進数と解釈されますが、zsh では n#数値の形式で指定するようです。

% echo $((0xFF))   return  //16 進数
255

% echo $((8#765))   return  //8 進数
501

% echo $((0765))    return  //8 進数とは解釈されない
765

% 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  //登録済みのエイリアスを表示
copy='cp -i'
find_mpr='find /Applications/MAMP/...中略  -exec ls -l {} \;'
run-help=man
which-command=whence

既存のコマンドを同じ名前で登録(再定義)

既存のコマンドを同じ名前で登録することで、そのコマンドを再定義することができます。

例えば、rm コマンドを使う際に毎回必ず削除するかどうかを確認するように -i オプションを指定して再定義することができます。

% alias rm='rm -i'  return //rm コマンドを再定義

% alias  return //登録済みのエイリアスを表示
copy='cp -i'
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つとも削除されている)

エイリアスの保存(~/.zshrc に記述)

エイリアスは、ターミナルの画面を閉じたりログアウトするとリセットされます。

~/.zshrc などの環境設定ファイルにエイリアスを登録すると、ログイン時に読み込まれて有効になります。

以下は echo コマンドとリダイレクトを使ってエイリアスの設定(alias copy='cp -i')を .zshrc に登録する例です。追記するので、リダイレクトには「>>」を使います。

% cat ~/.zshrc    return/ //.zshrc の内容を確認
PROMPT='%1~ %# '  #既存の設定が表示される

% echo "alias copy='cp -i'" >> ~/.zshrc    return/ //.zshrc に登録

% cat ~/.zshrc    return/ //.zshrc の内容を確認
PROMPT='%1~ %# '
alias copy='cp -i'  #追加される

1つのエイリアスを追加する場合は、上記のような方法がありますが、まとめて追加するには vim などのエディタで .zshrc を編集したほうが簡単です。

.zshrc はログイン時に読み込まれるので、再ログインするか、以下のコマンドを実行して設定内容をすぐに反映すればエイリアスが有効になります。

% source ~/.zshrc  return/ //設定内容をすぐに反映

関数

alias は引数を使う事はできないので、引数の指定が必要な場合は関数を使います。

関数は以下の書式で記述できます。

function 関数名 () {
    処理・・・
}

以下は xmanpage という名前の関数の定義の例です。

open コマンドの引数に x-man-page://$@ を指定しているだけの処理で、$@ は入力された引数を表す特殊変数です。x-man-page を開く書式は「x-man-page://コマンド名」になります。

この場合、2行目の末尾のセミコロンは省略できます。

引数に指定されたコマンドの x-man-page を開く関数の定義
function xman() {
  open x-man-page:\/\/$@ ;
}

上記を ~/.zshrc に記述しておけば、例えば find コマンドの x-man-page のマニュアルは xman find で開くことができます。

※ 但し、X11/XQuartz がインストールされている場合は、別のコマンドと競合するので、関数を xmanpage() などに変更する必要があるようです。

以下は pushd コマンドに +n オプションを指定して実行する場合に例えば「pdn 5」のように実行できるようにする関数の例です。「pdn 5」を実行すると「pushd +5」が実行されます。

$1 は1番目の引数を表す特殊変数です。

function pdn() {
  pushd +"$1"
}

以下は ~/.zshrc に記述する alias と関数の例です。

#alias
alias copy='cp -i'
alias pd=pushd
alias pd2='pushd +2'
alias pd3='pushd +3'
alias pd4='pushd +4'
alias dirs='dirs -v'

function xman() { open x-man-page://$@ }
function pdn() { pushd +"$1"}

参考サイト

参考になるサイト