Mac ターミナルの基本的な使い方・操作方法(1)
Mac のターミナルを使う方法の覚書です。ターミナルの設定や基本的なコマンド、リダイレクトやパイプの使い方など。zsh(Catalina 以降のデフォルトのシェル)に対応するように更新しました。
作成日:2019年08月26日
関連ページ
- Mac ターミナルの基本的な使い方・操作方法(2)エディタ: nano と vim
- Mac ターミナルの基本的な使い方・操作方法(3):シェル シェルスクリプト
- Mac ターミナルの基本的な使い方・操作方法(4):プロセス、シグナル、ファイルの圧縮と展開、ソフトウェアのインストール、ネットワークの基本コマンド
- Mac ターミナル zsh の設定・カスタマイズ(シェルオプション)
- Mac ターミナル defaults コマンドの使い方
Mac のターミナル
Mac のターミナルは「アプリケーション」→「ユーティリティ」にあります。
ターミナルのアイコンをダブルクリックするとターミナルが起動します。
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 )で表示されるインスペクタの「プロファイル」タブを選択して、いずれかのプロファイルをクリックすると現在のターミナルに反映されます。
また、現在選択されているプロファイルの設定の概要は「情報」タブで確認することができます。
Catalina 以降の macOS へアップデート
macOS Mojave 以前のバージョンではデフォルトのシェルが bash でしたが、Catalina 以降のバージョンでは zsh に変更になっています。
そのため、macOS Mojave 以前のバージョンを Catalina 以降のバージョンにアップデートした場合、ターミナルを開くと以下のようなメッセージが表示されます。
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~ %# '
続いて :wq と入力して内容を保存し vim を終了します。
.zshrc を反映
.zshrc の変更を反映するために、ターミナルで以下を実行します。
source ~/.zshrc return
以下はプロンプトの書式変更後のターミナルの例です。
関連項目:
コマンドの実行
コマンドを実行するには、プロンプトの後にコマンドを入力して 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 コマンドはテキストの表示に代替スクリーンを利用しています。以下は代替スクリーンの表示・非表示のショートカットキーです。
- 代替スクリーンを表示する: shift + command + page Down
- 代替スクリーンを非表示にする: shift + command + page Up
例えば、man コマンドを実行してマニュアルを表示中に shift + command + page Up を押せば、コマンドラインの表示を確認することができます。
また、man コマンドを終了後、shift + command + page Down を押せば、直前に開いていたマニュアルを確認することができます。
whatis コマンド
whatis コマンドはコマンドの簡単な説明を表示します。man -f に相当します。以下が書式です。
whatis コマンド名
コマンドの概要を知ることができます。
% whatis cd #または man -f cd builtin(1), !(1), %(1), .(1), :(1), @(1), {(1), }(1), alias(1), alloc(1), bg(1), bind(1), ..中略.. - shell built-in commands cd(ntcl) - Change working directory drutil(1) - interact with CD/DVD burners mount_cddafs(8) - mount an Audio CD 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 コマンドのマニュアルを開く
以下のようなマニュアルがターミナルで表示されます。
open コマンドを実行するのが面倒な場合は、以下を ~/.zshrc に追加しておくと「xman コマンド名」で x-man-page を開くことができます。
function xman() { open x-man-page:\/\/$@ ; }
関連:alias 関数
ターミナルのコンテクストメニューから開く
ターミナルのコマンドの文字の上で右クリックで表示されるメニューの「man ページを開く」でも 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 コマンドの箇所を見る必要があります。
インクリメンタルサーチ
コマンド履歴の中から特定のコマンドを検索するには、control + r を押します。
インクリメンタルサーチというモードになり、プロンプトの下に以下のように表示されます。
% control + r bck-i-search: _
続いて検索するコマンド名(文字)を入力すると、新しい方から古い方に向かって入力した文字を含むコマンドが検索されて表示されます。
% cat .zshrc ##入力された文字列を含むコマンドが表示される bck-i-search: ca_ ##入力された文字(この場合 ca)
control + r を更に押すと、同じ文字列を含む次に古いコマンドが検索されます。
引数などを続けて入力することで、コマンドを絞り込むことができます。
マーク機能
過去に実行したコマンドの結果などを確認するために、マークやブックマーク機能を使うことができます。
自動的または手動で設定したマークやブックマークの位置にキー操作で移動することができます。
- 角括弧([ ]):マーク
- 縦線(|):ブックマーク
ターミナルのメニューの「編集」→「マーク」→「プロンプトの行を自動的にマーク」にチェックが入っていれば、各プロンプトの行が自動的にマークされます。
または、マークしたい行を選択してショートカットメニューから「マーク」を選択することもできます(または command + u )。
マークを削除するには、マークを削除したい行を選択してショートカットメニューから「マークを解除」を選択します(または shift + command + u )。
ブックマークは、マークに名前を設定できるようにしたようなものです。
ブックマークを挿入するには、ターミナルのメニューの「編集」→「ブックマーク」→「ブックマークを挿入」または「ブックマークに名前をつけてを挿入」を選択します(または shift + command + m )。
マークやブックマークの位置に移動するには、ターミナルのメニューの「編集」→「移動」から選択したりショートカットキーが使えます。
- 前のマークへジャンプ ( command + ↑ )
- 次にマークへジャンプ ( command + ↓ )
- 前のブックマークへジャンプ ( option + command + ↑ )
- 次にブックマークへジャンプ ( option + command + ↓ )
ディレクトリを表す記号 ~ や .. (チルダ展開)
ホームディレクトリや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 による移動のみが実行される)
ディレクトリ
Finder から見たディレクトリ構造と実際のディレクトリ構造では多少異なっています。
以下は Finder から見たルートディレクトリ(Macintosh HD)のディレクトリ構造です。
以下は ls コマンドでルートディレクトリ(/)の一覧を表示した例です。
以下は shift + command + . を押して隠しファイルを表示した場合の Finder から見たディレクトリ構造です。
以下はルートディレクトリで 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 ...]
以下はオプションの一部抜粋です。
オプション | 意味 |
---|---|
-@ | -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 を実行できます。
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
以下のように指定したファイルが表示されます。
次の画面へ進むにはスペースキー、1行ずつ進めたい場合は Enter キーを押します。上下の矢印キーで上下にスクロールすることも可能です。終了するには q キーを押します。
以下は行番号付き(-N)で50行目(+50)から表示する例です。
% less -N +50 /private/etc/apache2/httpd.conf return
以下のように指定した行から行番号付きでファイルが表示されます。
以下は、「FollowSymLinks」と言う文字列を検索(-p)してその文字列のある行から行番号付き(-N)で表示する例です。
% less -N -p FollowSymLinks /private/etc/apache2/httpd.conf return
以下のように検索(-p)に指定した文字列がハイライトされ、行番号付きでファイルが表示されます。
マッチした文字列が複数ある(全てが画面に表示できない)場合は、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
ファイルが開きます。
/ キーを押し、続けて検索したい文字列(以下の例では 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 オプションを指定して実行すると、コマンドは終了せずに刻々と内容が追加されていくようなファイル(ログファイルなど)を監視することができます。
コマンド(ログの監視)を終了するには control + c を押します。
以下はシステム情報のログ(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 | パーミッションや所有者、タイムスタンプなどを保持(可能であれば、以下が保持される)
|
-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 系システムのリンクにはハードリンクとシンボリックリンクがあります。
ハードリンク
ハードリンクは既にあるファイルを別の名前で参照できるようにする仕組みで、ファイルの実態は1つしかありませんが複数のファイル名(ハードリンク)を持たすことができます。
言い換えると、ハードリンクは異なる名前で同じファイルの実態を示す機能です。リンク元やリンク先という区別はなく、ファイル名とリンク名はどちらも同等です。
ハードリンクを作成するには ln コマンドを使います。
以下はカレントディレクトリの sample.txt というファイルのハードリンクを作成する例です。
% ln sample.txt hard_link return
Unix 系のファイルシステムでは、それぞれのファイルを i ノード(i-node)番号と言うシリアル番号(重複のない番号)で管理しています。
ハードリンクの場合、実態は同じなので元のファイルとハードリンクは同じ i-node 番号になります。
ls コマンドを使って一覧表示する際に -i オプションを指定すると、i-node 番号が左端に表示されます。
% ls -il return total 16 2794388 -rw-r--r--@ 2 foo staff 18 1 20 13:43 hard_link 2794388 -rw-r--r--@ 2 foo staff 18 1 20 13:43 sample.txt
vim などを使ってどちらかのファイルを編集すると、ファイルの実態は1つなのでその内容は両方へ反映されます。
※ 但し、GUI のアプリケーション(例えばテキストエディットなど)を使って編集すると、i-node 番号が変わってしまい、別のファイルと見做され変更が反映されないようです。例えば、上記で作成した hard_link をテキストエディットで編集して保存しようとすると以下のように表示されます。
ハードリンクを削除しても元のファイルは削除されません。また、元のリンクを削除してもハードリンクが残っていればファイルの実態は削除されません。
ディレクトリのハードリンク
ディレクトリの場合、etc や usr といったディレクトリの名前の他に自分自身を示す「.」というハードリンクが自動で作成されます。
このため、ディレクトリにはハードリンクが少なくとも2つ(ディレクトリ名と .)存在します。
また、サブディレクトリがある場合はサブディレクトリから見た「..」(親ディレクトリ)があるため、ハードリンクの数は3つになります。
% ls -lia return total 0 3788840 drwxr-xr-x 3 foo staff 96 8 16 16:18 . 3695262 drwxr-xr-x 4 foo staff 128 8 16 14:55 .. #1つ上のディレクトリ 3791107 -rw-r--r-- 1 foo staff 0 8 16 16:18 sample.txt % ls -lia .. return #1つ上のディレクトリの一覧表示 total 16 3695262 drwxr-xr-x 4 foo staff 128 8 16 14:55 . 1124819 drwxr-xr-x+ 26 foo staff 832 8 16 15:14 .. 3788840 drwxr-xr-x 3 foo staff 96 8 16 16:18 link_test
シンボリックリンク
シンボリックリンクも既にあるファイルを別の名前で参照できるようにする仕組みですが、ハードリンクとはいくつかの点で異なります。
ハードリンクはファイルの実体を直接指し示しますが、シンボリックリンクはリンク先のパス名だけが保存されている擬似的なファイルで、macOS のエイリアスや Windows のショートカットに似ています。
ハードリンクと比べてシンボリックリンクには以下のような特徴(利点)があります。
- ディレクトリへのリンクが作成できる
- 異なるディスクボリュームのファイルへリンクが作成できる
また、ハードリンクと異なり元のファイルとは i-node 番号が異なります。
シンボリックリンクを作成するには ln コマンドで -s オプションを指定します。
以下はカレントディレクトリの sample.txt というファイルのシンボリックリンクを作成する例です。
% ln -s sample.txt symbolic_link return
ls -il で一覧表示させると、i-node 番号が異なっていることがわかります。
また、シンボリックリンクのファイル名には「 -> リンク元のファイル」が表示されます(symbolic_link -> sample.txt)。
% ls -il return #一覧表示 total 8 2803764 -rw-r--r--@ 1 foo staff 20 1 20 16:46 sample.txt 2803777 lrwxr-xr-x 1 foo staff 10 1 20 16:59 symbolic_link -> sample.txt
シンボリックリンクにアクセスすると、リンク先へのアクセスしたのと同じことになります。
例えば、テキストエディタでシンボリックリンクを開いた場合は、実体ファイルを開いた場合と同様に編集することができます。
cp コマンドでコピーすれば、実体ファイルのコピーが作成されます。
また、シンボリックリンクを削除しても元のファイルに影響はありません。
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 で見るとエイリアスとして表示されます。
パスの指定
シンボリックリンクを作成する際に、ファイルを相対パスで指定する場合は、リンクからの相対パスで指定する必要があります。
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 で見ると以下のように元のファイルと同じように表示されます。
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(フォーマット) | フォーマットを指定して表示。以下はフォーマットの例(一部抜粋)
|
-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
例えば以下のようなホームディレクトリがある場合、
検索パスに ~/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分未満は切り上げ)。
|
-atime n(時間差) | ファイルおよびディレクトリの最終アクセス時刻(access time)と,find が実行を開始した時刻の差(n 日)を指定して検索(1日未満は切り上げ)。
|
-cmin n(時間差) | ファイルおよびディレクトリの状態(コンテンツ、所有者、グループ、リンク数などの属性)が変更された時刻(change time)と,find が実行を開始した時刻の差(n 分)を指定して検索(1分未満は切り上げ)。change time:何らかの変更(内容や属性の変更)が発生した時刻
|
-ctime n(時間差) | ファイルおよびディレクトリの状態(コンテンツ、所有者、グループ、リンク数などの属性)が変更された時刻(change time)と,find が実行を開始した時刻の差(n 日)を指定して検索(1日未満は切り上げ)。
|
-mmin n(時間差) | ファイルおよびディレクトリの最終修正時刻(modification time)と,find が実行を開始した時刻の差(n 分)を指定して検索(1分未満は切り上げ)。modification time:内容の変更があった時刻(属性の変更は含まない)
|
-mtime n(時間差) | ファイルおよびディレクトリの最終修正時刻(modification time)と,find が実行を開始した時刻の差(n 日)を指定して検索(1日未満は切り上げ)。
|
-empty | 空のファイルの検索 |
-group グループ名 | 指定したグループに属するファイルを検索 |
-maxdepth n(深さ) | 検索するディレクトリの最大の深さを指定 |
-mindepth n(深さ) | 検索するディレクトリの最小の深さを指定 |
-iname パターン(名前) | ファイル名またはディレクトリ名をパターン(または文字列)で指定して検索。※大文字小文字を区別しない |
-name パターン(名前) | ファイル名またはディレクトリ名をパターン(または文字列)で指定して検索 |
-newer パス名(ファイルのパス) | 指定したファイルより後に修正されたファイルを検索 |
-perm パーミッション | 指定したパーミッションが設定されているファイルを検索 |
-prune | ディレクトリはたどらない(ディレクトリを除外)。-d オプションが指定されている場合は無効 |
-size サイズ | 指定したサイズのファイルを検索。サイズのあとに c を指定するとバイト単位で、k を指定するとキロバイト単位で、M を指定するとメガバイト単位で、G を指定するとギガバイト単位で評価。
|
-type タイプ | 指定したタイプのファイルを検索
|
-user ユーザー名 | 指定したユーザーに属するファイルを検索 |
-ls | 検索結果をデフォルトの出力(-print)に代わり「ls -dgils」の形式で出力(i-node 番号、サイズ、ファイルパーミッション、ハードリンク数、所有者名、グループ、サイズ、最終修正時刻、パス名を出力) |
-exec コマンド | 検索したファイルおよびディレクトリ(検索結果)に対して処理をするコマンドを指定して実行 -exec コマンド {} \; |
-ok コマンド | 検索したファイルおよびディレクトリ(検索結果)に対して処理をするコマンドを指定して実行。-exec とは異なり、コマンドを実行する際に渡された検索結果(引数)を1つずつ確認して実行。 -ok コマンド {} \; |
検索結果をフルパスで出力(デフォルト) | |
-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 ディレクトリに出力されます。
<!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> │ ├── <a href="./myDir/foo/bar/00Tree.html/">bar</a><br> │ │ └── <a href="./myDir/foo/bar/sample2.txt">sample2.txt</a><br> │ └── <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 というサイトを配置してある場合、
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 に出力されます。
<!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 コマンドで指定できるオプションです。
オプション | 意味 |
---|---|
-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
フィルタコマンド
パイプと組み合わせて使われる標準入力からデータを読み込み、標準出力に出力するコマンドをフィルタコマンドと呼ぶことがあります。
以下はよく使われるフィルタコマンドです。
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行目の末尾のセミコロンは省略できます。
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"}