UNIXの基本コマンド

提供: MacWiki
移動: 案内検索

UNIXターミナルで利用できる、代表的なコマンドを紹介します。 (⇒UNIX入門に戻る)

  • 他にはkillやpsですか?
  • パーミッションや chmod の解説もあれば良いですね。
  • 引数(オプション)とは?

man …各種コマンドのオンラインマニュアルを読む[編集]

コマンドのマニュアルをページャー上で表示させる。例えば man man を実行すると man コマンドのマニュアルが表示される。

ページャーの操作[編集]

矢印キー(または j、k キー)で画面がスクロールする。q キーで終了。 なお、h キーを押すとキー操作法(less の操作法)が表示される。 基本的なものは g(ファイルの先頭へ移動)、G(ファイルの末尾へ移動)、SPACE(次の画面)、w(前の画面)など。 また、/ に続けて「文字列」を入力し enter キーを押すと「文字列」を検索する。 n と N でそれぞれ「次を検索」、「前を検索」する。

cd …ディレクトリ間を移動する[編集]

例えば cd ~/Documents を実行すると、カレントディレクトリが「Documents(書類)」に移動する。 また、直前にいたディレクトリに戻る cd - もよく使われる。 なお、引数を与えず cd を実行することは cd $HOME を実行したことと同値である。

ls …ディレクトリ内のファイル・ディレクトリ(のリスト)を表示する[編集]

例えば ls /usr/bin を実行すると、「/usr/bin」内にあるファイルが表示される。 標準では .bashrc のように . で始まるファイルは表示されないが、a オプションを付けると全てのファイル・ディレクトリが表示される(ex. ls -a ~)。 また、l(エル)オプションを付けると、ファイルサイズ等の詳細情報が表示される(ex. ls -al ~)。

cp …ファイルやディレクトリを複製する[編集]

ファイル hoge を複製するには cp hoge geho ようにする。 このとき、ファイル geho が既に存在する場合は上書きされる(それを抑制するオプションとして、i(yes/no で応答)、n(上書きしない)がある)。 geho がディレクトリの場合は、ディレクトリ geho の中にファイル hoge が同名で複製される。なお、ディレクトリを複製する場合は R オプションを付ける(cp -R Documents backup)。

mv …ファイルやディレクトリを移動する[編集]

mv hoge geho のように使う。geho が存在しない場合は hoge(ファイルでもディレクトリでもよい)を geho とリネームしたことになる。geho が(存在する)ディレクトリの場合、hoge が geho の中に移動する。geho が既に存在するファイルの場合(このとき hoge もファイルでなければならない)は上書きされる(それを抑制するオプションとして、i(yes/no で応答)、n(上書きしない)がある)。 なお、mv file1 file2 dir1 のようにして、複数のファイル file1 と file2 を一気にディレクトリ dir1 へ移動することも出来る。

rm …ファイルの削除 (正しくはファイル名削除)[編集]

rm hogeのように使う。Trashに移動する訳ではないので、削除したら回復できないと思った方がよい。実際にはデータはそのまま残っている。完全に削除したければsrmを使用する。 ハードリンクを利用してファイル名が複数ある場合は削除していないファイル名から参照できる。

mkdir …ディレクトリの作成[編集]

mkdir hogeで新規にディレクトリが作成できる。

rmdir …空ディレクトリの削除[編集]

rmdir hogeで空のhogeディレクトリが削除できる。rm -r hogeで再起的にファイルを消してディレクトリを削除できる。

more, less …標準出力の表示を抑制する(ページャー)[編集]

出力が 1 画面に収まらないような場合に、more や less を併用すると、最初の 1 画面分のみ表示され、SPACE キーや ENTER キーで続きが表示されるようになる。 例えば、gzip 圧縮されたテキストファイルを表示したり、たくさんのファイルがあるディレクトリのリストを表示する場合に、zcat file.txt.gz | morels -alF /usr/bin | more のようにして使う。 テキストファイルであれば less -MN file.txt のように使うこともでき、vキーで vi コマンドによる編集に移行することもできる。ただし、日本語が通らないので、別途 lv コマンド等をインストールして使うことが推奨される。

  • less は環境変数 LESSCHARSET を utf-8 に設定すれば日本語が通るようです。ただし、行の折り返し部分で文字化けすることがあります。
  • lv : http://www.ff.iij4u.or.jp/~nrt/lv/
    • なお lv をコンパイルする際には、private byte *gz_filter = "gzcat"; (in stream.c) などとすると良いようです。("zcat" にするのではなくて)

gzip …ファイルを圧縮・展開(解凍)する[編集]

例えば gzip file.txt を実行すると、file.txt が圧縮され file.txt.gz という名前のファイルになる。 展開(解凍)するには、d オプションを付けて gzip -d file.txt.gz、あるいは gunzip コマンドを使って、gunzip file.txt.gz を実行する。

tar …書庫の作成・展開をする[編集]

複数のファイルやディレクトリをまとめて 1 つのファイルにしたり、それを元の状態に展開したりする。多くの場合、圧縮コマンド gzip や bzip2 と併用する。 例えば、ディレクトリ Documents(内のすべてのファイル・ディレクトリ)を丸ごと固めて gzip で圧縮するには tar -zcf mydoc.tar.gz Documents を実行する。gzip ではなく bzip2 で圧縮する場合は tar -jcf mydoc.tar.bz2 Documents を実行する(ファイル名や拡張子はもちろん何でもよい)。 逆に、展開するには tar -zxf mydoc.tar.gztar -jxf mydoc.tar.bz2 を実行する。なお、オプション引数において、x の代わりに t を使うと、(展開はされず代わりに)内容物のリストが表示される。なお、歴史的な経緯もあり、引数の - をなしで使うことも多い。

find …ファイルやディレクトリを検索する[編集]

基本形は「find 探す場所 -name 名前 -動作」。なお動作を指定しない場合は「表示(-print)」の指定と見なされる。

例えば 、下記を実行すると、/usr/local 内にある ptex という名前のファイル・ディレクトリを検索して表示する。

find /usr/local -name ptex

また、-delete オプションを付けると、見つかったファイル(と空のディレクトリ)が削除されるので、下記を実行すると、Documents 内にあるファイル .DS_Store がすべて削除される。

find Documents -name .DS_Store -delete

また、探す場所がシンボリックリンクの場合には -follow を付け、また検索ファイル名のワイルドカードはすぐに展開されないよう " " で囲む。下記は xargs コマンドへ検索結果を渡して、それらのファイルを削除させている。

find dir/dir1 -follow -name "*.txt" -print0 | xargs -0 rm -f

正規表現[編集]

find コマンドで -regex オプション(および extended (modern) regular expressions 指定の -E)を使い、正規表現で指定したファイル名を検索する。 例えば、"[数字のみ].txt" というファイルを検索するには、

find -E dir/dir1 -regex ".*/[0-9]+\.txt"

なお、grep コマンド利用では、下記のようになり、正規表現形式は同一というわけではない。

find dir/dir1 -name "*.txt" | grep ".*/[0-9]\+\.txt"

xargs … 引数リストを処理しコマンドへ渡して実行させる[編集]

xargs コマンドは、改行等で区切られた標準出力を受け取り、その引数のコマンドへ最終引数の引数リストとして渡す。

$ seq 8 | xargs echo -
- 1 2 3 4 5 6 7 8
$ seq 8 | xargs sh -c 'echo - $@' -
- 1 2 3 4 5 6 7 8
$ getconf ARG_MAX
262144

なお引数リストは長さがARG_MAXを超えることのないように自動的に分割され、その場合はコマンドを複数に分けて走らせる。

使用例[編集]

  • mv の第一引数へ find コマンドの検索結果を渡すには、xargs コマンドの -I オプションを使って、シンボル化(下記では % )させる。この場合、mv は一つずつファイルを処理する。
find dir/dir1 -name "*.txt" -print0 | xargs -0 -I % mv % dir/dir2
  • xargs の -J オプションを使って、mv に複数のファイルをまとめて処理させる。
find dir/dir1 -name "*.txt" -print0 | xargs -0 -J % mv % dir/dir2
  • GNU coreutils の mv (gmv) には xargs と相性の良いオプション(-t)が用意されている。
find dir/dir1 -name "*.txt" -print0 | xargs -0 gmv -t dir/dir2
  • xargs コマンドが標準出力からの各行を受け取る際、(ファイル名などで)空白文字が混じっていても1行の内容を1つの引数として扱わせるには、標準出力の改行の区切りはnull文字に変更する。xargs コマンドは -0 付きにする。find コマンドでは -print0 オプションを利用できる。
cat file_list.txt | tr '\n' '\0' | xargs -0 ls -d
  • 引数のコマンドの個々の標準出力をリダイレクトさせるには、そのコマンドを sh -c '...' の中に入れる。(下記の -P は並列実行数指定。COMMANDの出力を一固めにさせるためにddコマンドへ一旦渡している。)
find dir/dir1 -name "*.txt" -print0 | xargs -P 8 -0 -I % sh -c 'COMMAND % | dd obs=1m >> OUT.TXT 2> /dev/null'
  • 同上だが、4つの引数をCOMMAND へまとめて渡し、COMMANDが呼ばれる総回数を減らす。
find dir/dir1 -name "*.txt" -print0 | xargs -P 8 -L 4 -0 sh -c 'COMMAND $@ | dd obs=1m >> OUT.TXT 2> /dev/null' -
  • 標準入力をどう処理しどうコマンドへ渡すかの各種動作例(-I % は -J % -L 1 と同じ意味となる)
$ echo -e 'a b\nc\t \t d' | xargs echo -
- a b c d
$ echo -e 'a b\nc\t \t d' | xargs -J % echo - %
- a b c d
$ echo -e 'a b\nc\t \t d' | xargs -L 1 echo -
- a b
- c d
$ echo -e 'a b\nc\t \t d' | xargs -I % echo - %
- a b
- c d
$ echo -e 'a b\nc\t \t d' | xargs -n 1 echo -
- a
- b
- c
- d
$ echo -e 'a b\nc\t \t d' | xargs -0 echo -
- a b
c	 	 d

grep …ファイルの全文検索をする[編集]

例えば grep -irn hoge Documents を実行すると、「Documents」中から文字列「hoge」を含むファイルを検索して表示する。なお、i オプションは大文字・小文字を無視する(hoge のほか Hoge や HOGE も検索する)設定、r はサブディレクトリを検索する設定、n はファイル名だけでなく行番号も出力する設定。

  • ディレクトリ内ファイル全てを全文検索(スキップ指定:fifoファイル,ディレクトリ)
grep -D skip -d skip "pattern"  ./*
    • ただし,v. 2.5.1 (MacOSX 10.5.6で確認) では "-D skip" は働かない.

http://lists.gnu.org/archive/html/bug-grep/2004-11/msg00062.html


  • Grep (Cocoaアプリケーションソフト)

http://www.joar.com/grep/index.html

diff …2つのファイル・ディレクトリを比較する[編集]

diff file1 file2 を実行すると file1 と file2 の差異を出力する。また、パッチファイルの作成にも用いられる。例えば、diff -c file1 file2 > mypatch のように実行する。オプション -u 指定で unified diff形式で出力する(-c が context diff形式)。

生成されたパッチファイル mypatch を当てるには、patch コマンドを用いて、patch -b -p0 < mypatch のように実行する。このとき、(b オプションを付けたため)もとの file1 は file1.orig という名前でバックアップされ、file1 が file2 と同じ内容になる。

ソースコードツリー全体の差分をみる場合は -r オプションをつける。

diff -Ncr emacs.org emacs
diff -aurN old-dir new-dir
diff -cr FROM_DIRECTORY TO_DORECTORY > PATCH_FILE

ln …リンクを作成する[編集]

標準ではハードリンク(同じファイルに複数の名前を付ける)を作成し、s オブションを付けるとシンボリックリンク(ファイル名やディレクトリ名へのエイリアス)を作成する。例えば、source というファイル(またはディレクトリ)に target という名前のリンクを作成するには ln -s source target を実行する。注:普通はシンボリックリンクを使うと思いますが、ハードリンクとシンボリックリンクの違いについては Google で検索して下さい。

ハードリンクとシンボリックリンクの違い[編集]

ハードリンクは、ファイルの実体への参照を新たに作成します。ハードリンクされたファイルは参照カウントが増加し、参照しているファイル名を全て消さない限りファイルが消えることはありません。また、ファイルの実体を記憶しているため、どちらかを移動しても参照情報が残ります。シンボリックリンクは、ファイル名へのパス(絶対、相対を選択可)参照を新たに作成します。シンボリックリンクを削除しても元のファイルが消えることはありませんが、ファイルを消したり、移動したりするとシンボリックリンクがファイルを参照できなくなります。Finder から作成するエイリアスは、シンボリックリンクの要素が強いですが、ファイルの移動を追跡できるなどより柔軟な構造になっています。

エイリアス シンボリックリンク ハードリンク
元ファイルの移動 ×
元ファイルの削除 × ×
リンクの移動 ×(絶対パスは○)
元ファイルを消して新たなファイルを作成 ×
ディレクトリへのリンク ×
UNIXコマンド(cd/cp/find等)対応 ×

cat …ファイルの中身を出力する[編集]

他のコマンドと併用することが多いが、 cat ~/.bashrc のように比較的短いファイルの中身を覗くのに使える。 また、編集の必要がないような簡単なメモをターミナル(Terminal.app)上で作成する場合、cat > memo.txt を実行し、数行のメモを入力した後、Ctrl+c で終了すれば記述した内容が memo.txt に保存される。

ヒアドキュメント?

cat <<END > test.txt
a
END

tr …文字を置換する[編集]

基本的な使い方は tr A B(A を B に置換)と tr -d X(X を削除)。 例えば、tr -d "¥n" < file.w > file.m を実行すると、Windows で作った(標準的な)ファイル file.w(Shift_JIS/CR+LF)の行末コードを CR に変換したもの(つまり標準的な MacOS ファイル)が file.m として作成される(cat コマンドと併用して、cat file.w | tr -d "¥n" > file.m を実行したことと同等)。 また、tr "[:lower:]" "[:upper:]" < file.txt を実行すると、file.txt の中身の小文字を全て大文字に変換したものが出力される。試しに、ls | tr "[:lower:]" "[:upper:]" を実行してみるとこのコマンドの意味が分かるであろう。

行末コード変換色々

(Win -> Mac ) : tr -d "¥n" < file.w > file.m
(Win -> Unix) : tr -d "¥r" < file.w > file.u
(Mac -> Unix) : tr "¥r" "¥n" < file.m > file.u
  • tr のこの用法は Win → Unix の変換ですね。他の改行コードの変換はどうするのでしょう?
    • 上にまとめました。多分 tr では CR+LF への変換は出来ないのではないかと思いますので、やはり nkf コマンド等を使うのが普通でしょう。どうしても Mac OS X に付属のコマンドで実行したい場合は awkperlsed 等を使います。(例 sed 's/\r/\r\n/g' < file.m > file.w)
  • nkf -Lw などで改行コードが変換できますよね。

iconv …文字コードを変換する[編集]

l(エル)オブションを付けて iconv -l を実行すると、利用可能な文字コードの一覧が表示される。主なものは UTF-8(or UTF8)、EUC-JP(or EUCJP etc)、SHIFT_JIS(or SJIS etc)。 例えば、iconv -f SHIFT_JIS -t EUC-JP file.w を実行すると、Windows で作った(標準的な)ファイル file.w(Shift_JIS/CR+LF)を EUC に変換した結果が出力される。文字コードの部分は小文字でもOK。 ただし、iconv に行末コード変換機能はないので、(標準的な)UNIX 用ファイル file.u(EUC/LF)へ変換するには、tr コマンドと併用して iconv -f SHIFT_JIS -t EUC-JP file.w | tr -d "¥r" > file.u を実行しなければならない。文字コードや行末コードの変換には別途 nkf コマンドや qkc コマンドをインストールすることが推奨される。

UTF-8(or UTF8)の他に UTF-8-MAC(or UTF8-MAC)というエンコーディング形式があります。これはおそらく、Mac OS X のファイルシステムで使われている NFD 形式の Unicode だと思われます。(※)ls の出力をパイプで利用するときは、utf8-mac を使って ls | iconv -f utf8-mac -t euc-jp | ... としましょう。

sudo …superuserでコマンド実行[編集]

sudo hoge で root 権限でコマンド hoge を実行する。ソフトのインストール時などに用いる管理者用のコマンドである。パスワードの入力が必要。rootのパスワードではないので複数の管理者がいる環境ではパスワードの管理が楽。パスワードを入力してからしばらくはパスワードの入力を求められない。sudo -sでほぼsuと同様?

file …ファイルの情報を表示[編集]

$ file a.out
a.out: Mach-O 64-bit executable x86_64
$ 

which …コマンドのパスを確認する[編集]

コマンドの絶対パスを確認する。コマンドの有無も確認できる。

$ which man
/usr/bin/man

そのほか[編集]

MacOSX の zcat は .gz を伸張しないようです。MacOSX 10.4 -- 10.8 で確認。 ( gzip -dc もしくは gzcat を用いると .gz を伸張可能のようです)

  • MacOSX 10.4 の下で試してみたのですが下記のようになりました。
$ zcat file.obs.gz
zcat: file.obs.gz.Z: No such file or directory
$ lv file.obs.gz
zcat: file.obs.gz.Z: No such file or directory
    • zcat は .Z のみを伸張するのが本来のようです。しかしこれでは不便なので .gz も伸張できるようにさせていることが多くの通例になっているようです。(ということはMacOSX 10.4は通例派ではなくて本来派?)
    • 10.3.9 では .gz を指定しても動作しますので、バグとみなした方がよさそうです。man page にも使えると書いてありますね。-- saiki

Wiki内の関連ページ[編集]