pubDate: 2024-03-04
author: sakakibara
linuxにはPOSIXに準拠してるコマンドを中心に様々なコマンドがある。
その中でもかなり使用頻度が高いと思われるものが以下だ。
manを読めば良くない?
そういう意見もあるだろう。
だが、基礎的の中でも以外と見落としがちなオプションもあると思う。
そういった以外なオプションも併せて紹介していこうと思う。
ディレクトリを移動する。
cd -
cd -L directory
cd -P directory
世界でもっともタイプされた2文字だと思う。
command | description |
---|---|
cd - | 直前にいたディレクトリに移動する。直前にいたディレクトリはOLDPWDという環境変数に格納される。 |
cd -L directory | direcotyがシンボリックリンクの場合、実態に移動する。 |
cd -P directory | direcotyがシンボリックリンクの場合、そのディレクトリへ移動する。 |
cd -
を知らない人は以外といるのではないだろうか?
少し違うが、popd, pushd
というコマンドがある。
これは移動したディレクトリをスタックに貯めるというものである。
昔このコマンドを使おうと考えていた時期があったが、実際、4文字のコマンドを打つ苦痛がやる気を上回り、使うことをやめてしまった。
作業ディレクトリを表示する。
pwd -L
pwd -P
いまどこ? カレントディレクトリ・作業ディレクトリをprintする。
command | description |
---|---|
pwd -L | 環境変数PWDを使用する。 |
pwd -P | シンボリックリンクを除く。 |
PWDはカレントディレクトリのパスが格納された環境変数である。
ディレクトリA, B, C, Dがあるとする。Cの下にDがあり、そのファイルにシンボリックリンクEが貼られているとする。
この場合Eを経由してCへ移動するとする。その場合のPWD(pwd)は
となる。
ここでpwd -P
とすると、
となる。
ファイル・ディレクトリの要素を表示する。
ls -a
ls -l
世界でもっともタイプされた2文字だと思う。 オプションが多すぎる。lsを読まなければプログラマを名乗るべきではないという考えがある。実は以外と実装するのが難しいコマンドとしても知られている。
command | description |
---|---|
ls -a | all、つまりすべて表示する。隠しファイルも表示する。 |
ls -l | long, 多くの情報を表示する |
ls --hide | パターンマッチしたファイルは表示しない。 |
オプションが多すぎてすべてを追うのは難しい。この2つをよく利用する。とは言っても、オプションを指定しているわけではなく、linuxディストリビューションによってはla=ls -a
, ll=ls -l
のようにaliasが指定されてある。なお、--color
というオプション
もあり、これを指定することで色がつき、テンションが上がる。
ディレクトリを作成する。
mkdir -p directory
mkdir -m directory
意外と-p
コマンドを使用する。
command | description |
---|---|
mkdir -p directory | 作成したいディレクトリの親のディレクトリが存在しなければ作成する。 |
mkdir -m directory | 作成と同時にfile modeを設定する。 |
ディレクトリを削除する。空ならね。
rmdir -p
じつはこれに近いコマンドがMS-DOSにも実装されている。
command | description |
---|---|
rmdir -p | 親のディレクトリまで削除します。rmdir -p a/b はrmdir a/b a と同じ |
実際にはディレクトリの中にファイルが入っているまま削除する場合が多いため、このコマンドはほとんど使用しない。
本当は中身を削除して、ディレクトリが空であることを確認した上でrmdirで削除したほうが安全なのかもしれない。
ファイルを連結する。
cat -n file1 file2
cat -E file1 file2
おや?と思った方も多いだろう。 catコマンドというとファイルの中身を見るコマンドとして知られるからだ。
command | description |
---|---|
cat -n file1 file2 | ファイルを繋げて行番号を表示する |
cat -b file1 file2 | ファイルを繋げて行番号を表示する(空行以外) |
cat -E file1 file2 | ファイルを繋げて行末文字を表示する |
cat - | catの入力として標準入力を使う |
このコマンドの本質は引数を与えられた複数のファイルを結合して標準出力に流すことにある。 ファイルの中身を見るという使い方は目的のファイルと0個のファイルを結合して標準出力に流すという処理に相当する。
この他に重要な使い方としてヒアドキュメントを利用した書き方がある。
指定した文字(EOF)が出てくるまでを入力とする書き方でshell scriptの中などで意外と使用される。
もっと表示する。
more -p file
more -n number file
command | description |
---|---|
more -p file | moreしたあとにスクリーントップまでスクロールします。 |
more -n number file | n字行頭から表示します |
次のless
が優秀過ぎて完全に下位互換です。
moreとは違う。
less -N file
less -X file
command | description |
---|---|
less -N file | 行番号を表示 |
less -X file | lessで表示した内容をターミナルに残す。 |
moreとは異なり、後ろに戻ることができる。また、moreとはことなり、一度にすべて読み込んでいるわけではないので大きなファイルを開く際に有効。そして何よりvi likeなキーバインドで操作できるのでvi like キーバインドに慣れている人にとってはかなり使いやすい。
特に、砂漠のような環境では必ずしもターミナルがスクロールできるとは限らない。
そもそもスクロールという概念がGUIシステムがなければ成り立たないものだからだ。
そんなとき、lessコマンドがデフォルトで入っていることに深く感謝する日がくるだろう。
そして、ちょっとしたファイルを開くのにVScodeなどを使用していた過去の自分に後悔するのだ。
less
..お前がいたのにな。ずっと傍で見守っててくれたんだな。と。
ファイルの尻尾だけ見せる。
tail -n number file
tail -f file
command | description |
---|---|
tail -n 10 file | ファイルの末尾20行を表示する。 |
tail -f file | 増えていくファイルを追跡(follow)表示する。 |
tail
意外にもhead
というコマンドがある。
tail
と同じコマンドで効果は逆となる。
特にtail -f file
が面白い。
指定したファイルが書き込まれるとそれを追跡して表示してくれる。
どうもログを追跡表示する際に使用するらいしい。
タイムスタンプを更新する。
touch -a file
touch -m file
え、このコマンドって空のファイルを作るコマンドじゃないんですか? そう思った人も多いだろう。
command | description |
---|---|
touch -a file | アクセス時刻を変更する。 |
touch -m file | 更新時刻を変更する。 |
昔、恩師からアクセス時刻や更新時刻を変更するということを教えてもらった。 そもそもファイルのアクセス時刻や更新時刻とはなんだろうか。 ファイルには以下のタイムスタンプがある。
timestamp | mean | description |
---|---|---|
atime | access | ファイルを読み込んだ際に更新される。 ctimeの更新でも更新される。 |
ctime | change | ファイルの内容を変更した際に更新される。 mtimeの更新でも更新される。 |
mtime | modify | ファイルの内容を変更した際に更新される。 |
ファイル or ディレクトリを削除する。
rm -r file
rm -f file
command | description |
---|---|
rm -r file | 再帰的に削除する。つまり、中にディレクトリがあろうが削除する。 |
rm -f file | 強制的に削除する。問答無用 |
世の中に絶望し、自暴自棄になっていた俺はrm -rf
を使うことになんの躊躇いもなかった。
ある日、何かの間違いで’~‘というファイル名のファイルを作ってしまった。
“チッ、舐めたツラしたファイルだな。消してやる。“
俺はホームレスになっていた。
ファイルを移動(名前の変更)をする。
mv -f source dest
mv -S=hoge source dest
mv -b=never source dest
command | description |
---|---|
mv -f source dest | 同じ名前のファイルがあっても強制的に移動させる。 |
mv -S=hoge source dest | 同じ名前のファイルあったら末尾に文字列(hoge)を追加する。 |
mv -b=never source dest | 同じ名前のファイルがあったらバックアップ(~)を指定する |
基礎的なコマンドほど実力が問われる。
ここで取り上げたコマンドは基本的に同じコマンドがあった際にどのように振る舞うかだ。
いちいち他の名前にしたディレクトリを作成してからmvをするのでは手間がかかる。
そこで、上記のようなコマンドを使用する。
基本的にalias mv=mv --backup=never
のようにエイリアスを指定して使用する。
また、たまにスクリプトで見かけるのがブレース展開である。12
簡単に言ってしまえばカッコ{}を外延的に展開する。
そして展開した文字列には分配法則のような規則が適応される。
まぁ、そんな感じ。
この場合hoge.suffix
というファイルが生成される。
ファイルをコピーする。
cp -r source dest
cp -a source dest
cp -s source dest
mvと似たようなコマンド(—backup, -S, -f)も一応ある。
command | description |
---|---|
cp -r source dest | 再帰的にコピーする。 |
cp -a source dest | アクセス権も含めて再帰的にコピーする。 |
cp -s source dest | シンボリックリンクを作成する。 |
最後のコマンドを見て、嘘だろ。ln
の立場なくなるやんけ。と思った方もいるだろう。
ここで作成したシンボリックリンクはカレントディレクトリに作成される。
リンクを作成する。
ln -s target link_name
ln -f target link_name
linuxはファイル・ディレクトリ・リンクの3つの原子で構成されている。
というかそもそもファイルって何?
我々調査隊はファイルシステムの奥地 へと向かった…
command | description |
---|---|
ln -s target link_name | シンボリックリンクを貼る |
ln -f target link_name | 既にリンクがあったら削除する。 |
引数を特に使用しないならハードリンクになる。 とはいってもあまりハードリンクを使用したことがない。
ファイルを探す。
find path -maxdepth 2 -name 'file_name_reg'
find path -mindepth 3 -path 'path_name_reg'
find path -type f -name 'path_name_reg' -printf
これもオプションが多い。unixの哲学はどうした。kissはどうした。
command | description |
---|---|
find path -maxdepth 2 -name 'file_name_reg' | 最大深さ2でpathからスタートしてfile_name_reg でマッチするファイルを探しパスを表示する。 |
find path -mindepth 3 -path 'path_name_reg' | 最小深さ3でpathからスタートしてpath_name_reg でマッチするパスを探してパスを表示する。 |
find path -type f -path 'path_name_reg' -printf | pathからpath_name_reg にマッチするパスを探し、ファイルを集め、表示する。 |
find
コマンドのexpressionにワイルドカードなどを使用する場合はシングルクォート(ダブルクオート)で囲む必要がある。shellが展開してしまい複数のexpressionが渡されてしまうためである。
たとえば、
だと、実質
のようにfind
コマンドを呼び出していることと同じになる。
find
コマンドはtypeオプションを使用することでファイルの種類を指定することができる。これはファイルやディレクトリ以外にもブロックファイルやキャラクタファイル, ソケットなども指定することができる。
また、-printf
オプションのようにファイルを実行することができる。
-exec rm
のようにするとfind
見つけたファイルを削除することができる。
mode を変更する。
chmod -R 777 file
chmod ug+x file
見ざる・書かざる・動かざる
| command | description |
|:---------------------|--------------------------------------|
| chmod -R 777 file
| 再帰的に権限を変更する。 |
| chmod -R ug+x file
| ユーザとグループに実行権限を与える。 |chmod
コマンドはファイルの権限を変更するコマンドである。
ファイルにはアクセス権限という概念があり、だれがそのファイルにアクセスできるかを制御することができる。
どのアクセス権限が設定されているかはls -l
コマンドで確認することができる。
上記の例で、B
というディレクトリはユーザーsakakibara
が所有しており、グループsakakibara
に属している。
drwxr-xr-x
は
d
directoryrwx
はread, write, execute
を表す。rwx
が3つあるが、それぞれ前からユーザ(ファイルの所有者)、グループ、その他に関するアクセス権限を表す。
ファイルBはsakakibaraは読み書き実行ができ、sakakibaraに属しているユーザは読み込みと実行ができるが書き込みはできない。
その他のユーザーは実行しかできない。
ということを表している。
777
とはユーザ、グループ、その他それぞれのrwx
を8進数で表した数である。
それぞれ次のように対応している。
x
: 1w
: 2r
: 4例えば、ユーザーが読み書き実行が可能ならば
となり、
グループが読み込みと実行が可能ならば
その他のグループは何もできないならば
となり、750
となる。
ownershipを変更する。
chown user:group file
chown -R user:group file
ファイルのオーナーは誰。command | description |
---|---|
chown user:group file | ユーザーとグループを変更する。 |
chown -R user:group file | 再帰的にユーザーとグループを変更する。 |
ファイルの所有者がどのユーザーか、どのグループかを変更するコマンドである。
たとえば、ls -l
で
であるならば、chow root:root B
とすることでBの所有者をrootに変更することができる。
プロセスを見る。
プロセスを見るコマンドである。 次のコマンドと合わせて使用することが多い。 なぜか制御端末があるプロセスかどうかについての情報が多い。
ps -A
ps a
ps -C
command | description |
---|---|
ps -A | 全てのプロセスを表示する。 |
ps a | 制御端末を持つプロセスを表示する。 |
ps x | 制御端末を持たないプロセスを表示する。 |
ps u | プロセスのユーザーも含め表示する。 |
ps -C zsh | コマンド名でプロセスを表示する。 |
ps aux
のようにするとより詳細な情報を表示することができる。
ジョブを殺す。
kill pid
kill -l
kill -s SIGNAL pid
kill %job
command | description |
---|---|
kill pid | pidのプロセスを消す。kill -s TERM pid と同じ |
kill -l | シグナルの一覧を表示する。 |
kill -l SIGNAL | シグナルの番号を表示する。 |
kill -s SIGNAL pid | シグナルを指定してプロセスに送る。 |
kill $job | ジョブを消す。 |
ジョブはシェルによって管理されるプロセスの集まりである。 コマンドによって生じる複数のプロセス群をまとめて管理するために使用される。これによって単一のコマンド(だが、複数のプロセスを生成する)ものを一つのものとして(ジョブとして)管理することができる。
圧縮ファイルに対するgrep
オプションはgrep
で使用されているものを引き継ぎます。
このコマンドって何?
パイプ先の処理時間を表示する
指定した時刻にプログラムを走らせる
変数を環境変数に出荷する おまえ、コマンドだったのか。シンタックスだと思ってた。