809
935

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Bashを使いこなすための必須コマンド71選

Last updated at Posted at 2023-06-12

はじめに

mkdir, ls, cp, touch, mv, rm以上のコマンドにあんまり触れていない。。。という方、もっとコマンドを使いこなしたい!という方。。。必見。
基本的だが全部網羅するには大変な基本コマンド及びショートカットを溢れんばかり71選お届けします。たくさんありますので、表題に何のコマンドか書いてあるのをご活用ください。
一部、macユーザー向けとなっていることをご了承ください。

弊社Nucoでは、他にも様々なお役立ち記事を公開しています。よかったら、Organizationのページも覗いてみてください。
また、Nucoでは一緒に働く仲間も募集しています!興味をお持ちいただける方は、こちらまで。

Ctrl を使ったショートカット

最初に、Ctrlを使ったショートカットを紹介します。

Ctrl-A 行頭移動

スクリーンショット 2023-05-17 15.11.21.png

スクリーンショット 2023-05-17 15.37.11.png

Ctrl-E 行末移動

スクリーンショット 2023-05-17 15.11.21.png

スクリーンショット 2023-05-17 15.37.41.png

Ctrl-W 直前一単語を削除

スクリーンショット 2023-05-17 16.04.17.png

スクリーンショット 2023-05-17 16.04.34.png

Ctrl-U カーソルの左から行頭まで削除

スクリーンショット 2023-05-17 15.11.21.png

スクリーンショット 2023-05-17 15.33.54.png

Ctrl-K カーソル位置から末尾までの行を削除

スクリーンショット 2023-05-17 15.11.21.png

スクリーンショット 2023-05-17 15.42.14.png

Ctrl-Y 直前に削除した中身をペースト

Ctrl-KCtrl-Uで削除した中身をペーストします。クリップボードとは別扱いになります。

例)Ctrl-KCtrl-Yを使用
スクリーンショット 2023-05-17 15.11.21.png
Ctrl-K
スクリーンショット 2023-05-17 15.42.14.png
↓改行
スクリーンショット 2023-05-17 15.44.24.png
Ctrl-Y
スクリーンショット 2023-05-17 15.42.31.png

Ctrl-Q 出力一時停止を解除

出力一時停止(Ctrl-s)を解除する。
うっかりCtrl-sキーを押してしまい、コンソールやターミナルがキー入力を受け付けなくなったときは、Ctrl-Qで元の状態に戻る。

TABで補完

Tabキーでファイル・フォルダのパスを補完できる他、予測されるコマンドも補完することができます。予測候補が複数ある場合は、下記のように表示されます。

$ d
dappprof                       dirname
dapptrace                      dirs
dash                           disklabel
date                           diskutil
db_archive                     disown
db_checkpoint                  display
db_codegen                     dispqlen.d
db_deadlock                    distnoted
db_dump                        ditto
db_hotbackup                   djpeg
db_load                        djxl
db_printlog                    dmc
db_recover                     dmesg
db_stat                        dnctl
db_upgrade                     dns-sd
db_verify                      do
--More--

ちなみにzshでは、tabキーを2回押すと候補がアルファベット順にコロコロ変わる仕様があります。

& / && / ; 複数コマンドを続けて実行 

$ command1 & command2

この書き方でcommand1 が終わるのを待たずにcommand2を実行することができます。

例:

$ python3 foo/hoge.py & python3 foo/hogehoge.py
[1] 55312
hogehoge.py is executed
hoge.py is executed
[1]  + done       python3 foo/hoge.py

スクリーンショット 2023-04-25 14.27.44.png

例では、command1にあたるpython3 foo/hoge.pyより先に、command2にあたるpython3 foo/hogehoge.pyが完了しています。&を使用すると複数のコマンドを並列に処理できます。最後に書いたコマンドのみフォアグラウンドで実行し、残り(今回の例だとcommand1)はバックグラウンドで実行されます。command1command2 の実行が完了する順序は保証されません。
また、[1] 55312 は、バックグラウンドで実行されたコマンドのジョブ番号とプロセスIDと呼ばれるものです。ジョブ番号が1で、プロセスIDが55312でした。+ done は、ジョブが完了したことを表します。
ちなみに、

$ command1 & command2 & command3

のように3個以上並べて書くこともできます。

さらに、

python3 bar.py &

のように書くと、処理をバックグラウンドで実行させ、実行している間(完了していなくても)、プロンプトは自由に使えます。

$ command1 && command2

$ ls foooo && python3 bar.py
ls: foooo: No such file or directory

&&でも複数コマンドを同時実行できますが、これは&とは異なり順次実行です。つまり、フォアとかバックとかないやり方で、command1の処理が終わらないと、command2が実行されません。
また、例を見るとわかるようにcommand1が失敗するとcommand2は実行されません。例では、fooooというディレクトリがないのでエラーとなり、続くpython3 bar.pyは実行されませんでした。

$ command1 ; command2

;&&とほぼ同じ使い方ができますが、;は前のコマンドの成功・失敗に関係なく続くコマンドを実行できます。

Ctrl + z , fg コマンドの一時停止と再開 

$ python3 bar.py
^Z
[1]+  Stopped                 python3 bar.py
$ fg
python3 bar.py
bar.py is executed

Ctrl + Cでコマンドを強制停止でき、Ctrl + Dで、特別な状態が抜け出せることを知っている方は多いでしょう。
Ctrl + Zは実行中のコマンドを一時停止することができるショートカットです。
一時停止したコマンドはfgコマンドで再開できます。
また、jobsコマンドでバックグラウンドの様子を確認することができます。

$ jobs
[1]-  Running                 python3 bar.py &
[2]+  Stopped                 python3 foo/hoge.py

{} 複数ディレクトリ、ファイルを一度に作成

$ touch {}

{}を使うと似た名前のファイル・ディレクトリを同時に作るのに便利です。

touch sample{1,2,3}.txt

スクリーンショット 2023-04-25 16.01.42.png
{}の中で、変えたい文字の後に,を打ちます。,の後にスペースが開かないように注意してください。
このコマンドはこのように書くこともできます。

touch sample1.txt sample2.txt sample3.txt

任意の名前ファイルを一気に作ることができますね。

$ mkdir {}

$ mkdir -p fruits/{apple,orange,banana}_imgs

スクリーンショット 2023-04-25 15.54.48.png

ディレクトリの場合も同様です。例では、fruitsという元々存在しないディレクトリを-pオプションで一気に作っています。-pオプションは複数階層のディレクトリを作成する際に便利なオプションです。

cp foo{,_copy}.py

cp foo{,_copy}.py
は、
cp foo.py foo_copy.pyと同じです。

cp foo{.py,.bak}
は、
cp foo.py foo.bakと同じです。
バックアップを取りたい時に使えますね。

echo {1..10}.txt 数字の範囲を展開

$ echo {1..10..2}.txt
1.txt 3.txt 5.txt 7.txt 9.txt

この{1..10..2}は1から10までの数字を2ずつ増やしながら展開するという意味です。{1..10}.txtなら1から10まで順番に展開されます。
一部のbashではサポートされていない場合もあります。

echo 文字列を表示する

文字列を表示するだけのシンプルなコマンドです。

$ echo Hello!
Hello!

$を使うと環境変数を指定できます。

$ a=everyone
$ echo Hello, $a.
Hello, everyone.

$ echo 文字列 > ファイル名 文字列をファイルに書き込み

>と併用することで、ファイルに書き込みできます。ちなみにこの書き方は新規ファイルの作成も同時にやってくれます。

$ echo apple > sample1.txt
$ cat sample1.txt
apple

ls -l ファイルの属性の一覧

ファイルとファイルの属性の一覧を取得します。
左から順に、

  • パーミッション
  • ハードリンク数
  • 所有者
  • グループ
  • ファイルサイズ
  • 最終更新日時
  • ファイル(ディレクトリ)名

を表示します。
パーミッションについて詳しく知りたい方は以下をご参考ください。

$ ls -l 
total 16
-rw-r--r--  1 ishiishuto  staff   80  4 25 15:32 20seconds.py
-rw-r--r--  1 ishiishuto  staff   69  5 17 15:56 bar.py
drwxr-xr-x  4 ishiishuto  staff  128  4 22 15:31 foo
drwxr-xr-x  5 ishiishuto  staff  160  4 25 15:54 fruits
drwxr-xr-x  5 ishiishuto  staff  160  5  5 16:58 sample
drwxr-xr-x  6 ishiishuto  staff  192  4 25 16:18 venv

pwd カレント・ディレクトリを取得

「print working directory」の略です。現在の自分の位置(カレント・ディレクトリ)を表示します。

$ pwd
/Users/ishiishuto/work/sample

top 実行中のプロセスをリアルタイム表示

実行中のプロセスをリアルタイムで、CPU利用率が高い順に表示します。

Processes: 623 total, 2 running, 621 sleeping, 3793 threads                                                                    16:32:08
Load Avg: 1.85, 1.65, 1.60  CPU usage: 6.71% user, 6.13% sys, 87.15% idle  SharedLibs: 483M resident, 86M data, 134M linkedit.
MemRegions: 910308 total, 5452M resident, 234M private, 1782M shared. PhysMem: 15G used (1660M wired, 4480M compressor), 240M unused.
VM: 323T vsize, 4142M framework vsize, 0(0) swapins, 0(0) swapouts. Networks: packets: 2823931/3335M in, 933755/226M out.
Disks: 4904757/66G read, 7729950/66G written.

PID    COMMAND      %CPU  TIME     #TH    #WQ  #PORT MEM    PURG   CMPRS  PGRP  PPID  STATE    BOOSTS            %CPU_ME %CPU_OTHRS UID
159    WindowServer 29.7  33:46.86 21     6    2153  500M   14M    114M-  159   1     sleeping *0[1]             2.44052 1.14758    88
2286   Code Helper  14.2  02:15.11 24     1    239+  191M+  0B     71M-   2278  2278  sleeping *0[1]             0.00000 0.00000    501
462    Google Chrom 13.3  23:01.08 48     2    1624  715M   0B     193M-  462   1     sleeping *2307[212]        0.83111 1.80302    501
0      kernel_task  13.3  37:52.94 477/8  0    0     2448K+ 0B     0B     0     0     running   0[0]             0.00000 0.00000    0
19880  top          7.1   00:03.44 1/1    0    38    6481K  0B     0B     19880 2370  running  *0[1]             0.00000 0.00000    0
2281   Code Helper  5.1   00:56.61 12     3    229+  331M+  768K   48M-   2278  2278  sleeping *1[11]            0.08256 0.00000    501
2278   Electron     3.9   01:23.95 31     2    516   106M   16K    49M    2278  1     sleeping *0[5887]          0.25412 0.56849    501
488    Simulator    1.1   01:10.24 4      2    273   43M    0B     32M    488   1     sleeping *0[11548]         0.00000 0.00000    501
259    TouchBarServ 0.9   02:33.08 4      2    284   19M    2880K  8528K  259   1     sleeping *0[1]             0.00000 0.14946    0
530    Google Chrom 0.9   08:49.14 25     5    948   565M   62M    95M    462   462   sleeping *1[5]             0.00000 0.00000    501

cat ファイルの中身を確認

catはファイルの中身を確認するコマンドです。

$ cat sample2.txt
APPLE
BANANA
$ cat sample3.txt 
orange

ファイルの結合

複数のファイルを結合して1つのファイルにすることもできます。

$ cat sample1.txt sample3.txt > marged.txt
$ cat marged.txt                          
apple
orange

ファイル内容の追記

cat new_content.txt >> existing_file.txt

catコマンドには>>演算子を使用して、既存のファイルに新しい内容を追記することもできます。上の例では、new_content.txtの内容がexisting_file.txtに追加されます。

head 先頭のn行を抜き出す

$ cat sample1.txt 
Apple
Banana
Orange
Strawberry
Grape
Pineapple
Watermelon
Mango
Lemon
Peach
Pear
Cherry
Kiwi
Blueberry
Raspberry
Avocado
Papaya
Plum
Fig
Coconut

に対して、デフォルトは先頭10行を抜き出します。

$ head sample1.txt 
Apple
Banana
Orange
Strawberry
Grape
Pineapple
Watermelon
Mango
Lemon
Peach

$ head -15 sample1.txtとすれば、15行抜き出せます。
パイプ|を使って、ls . -l | head -20などとすれば、カレントディレクトリ下の20個のファイルの情報が得られます。

tail 末尾のn行を抜き出す

headに対して、tailコマンドはファイルの末尾から指定された行数の内容を表示します。
headと同じようにパイプ|と併用して使うことができます。

$ tail sample1.txt 
Pear
Cherry
Kiwi
Blueberry
Raspberry
Avocado
Papaya
Plum
Fig
Coconut

kill プロセスIDを指定し強制終了

$ kill <PID>

<PID>にはプロセスIDを指定します。プロセスIDはpsコマンドで確認できます。アプリケーションが応答しなくなったときなどに使用します。

killall プロセスの名前を指定し強制終了

指定されたプロセス名に一致するすべてのプロセスを終了させます。killallコマンドはkillと違い、プロセス名を指定するだけで、プロセスID(PID)を調べる必要がありません。

$ killall <process_name>

<process_name>には終了させたいプロセスの名前を指定します。

w ユーザーのログイン情報

システムに現在ログインしているユーザーのリストや、各ユーザーの活動情報を表示するために使用されます。

  • USER: ユーザー名
  • TTY: ログインに使用されている端末名
  • FROM: ログイン元のホスト名またはIPアドレス
  • LOGIN@: ログイン日時
  • IDLE: 最後の操作からの経過時間
  • JCPU: ユーザーが実行中のジョブのCPU時間
  • PCPU: ユーザーが実行中のプロセスのCPU時間
  • WHAT: ユーザーの現在のコマンドまたはプログラム
$ w
 23:45:10 up 1 day,  3:30,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user1    pts/0    192.168.1.101    23:30    5.00s  0.10s  0.00s w
user2    pts/1    192.168.1.102    23:20   15.00s  0.05s  0.00s bash
user3    pts/2    192.168.1.103    23:10    0.00s  0.02s  0.00s sshd: user3 [priv]

cd $_ , cd -

ディレクトリを切り替えるコマンドcdの便利な使い方を紹介します。

cd $_

mkdirしたコマンドに即座に移動できます。

sample user_name $ mkdir new_dir
sample user_name $ cd $_
new_dir user_name $

cd -

移動する前のディレクトリに移動します。

sample $ mkdir -p new_dir/bar/foo
sample $ cd $_
foo $ cd -
sample $

mv ファイル移動とリネーム

mvはファイルの移動に使うコマンドです。

$ mv ファイル名 目的のディレクトリ

ファイルをリネームする

mvはファイルの名前を変更するのにも使えます。mv 古いファイル名 新しいファイル名で使います。

$ ls
sample1.txt
$ mv sample1.txt sample2.txt
$ ls
sample2.txt

ワイルドカードを利用して一気に移動

$ ls
sample1.txt     sample2.txt     sample3.txt
$ mv sample?.txt ../bar
$ ls bar
$ ls ../bar
sample1.txt     sample2.txt     sample3.txt

?は任意の一文字とマッチ、*は0個以上の任意の文字列にマッチします。以上の操作は、

$ mv sample[123].txt ../bar

とかでもできます。[]は指定した文字のいずれか1文字にマッチします。

cal カレンダーの表示

カレンダー表示のコマンドです。

$ cal
      5月 2023         
日 月 火 水 木 金 土  
    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           

cal -y 年間のカレンダー

-yオプションで年間のカレンダーを出せます。-y 2000とすれば、2000年のカレンダーが得られます。

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

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

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

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

cal -m 指定した月のカレンダー

$ cal -m 3
      3月 2023         
日 月 火 水 木 金 土  
          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

chmod アクセス権限(パーミッション)の変更

ファイルやフォルダのアクセス権限(パーミッション)を変更します。change modeの略称です。パーミッションはls -lコマンドで確認できます。

$ ls -l
total 8
drwxr-xr-x  2 user  group  4096 Jan 12 10:32 directory1
-rw-r--r--  1 user  group    56 Jan 12 10:32 file1.txt
-rw-r--r--  1 user  group   128 Jan 12 10:32 file2.txt

最初の10文字のdrwxr-xr-xなどが、パーミッションです。
例えば、drwxr-xr-xという文字列なら、

  • 1文字目: ファイルタイプ

    \- : 通常のファイルを表します。
    d : ディレクトリを表します。
    l : シンボリックリンクを表します。

  • 2-4文字目: 所有者のパーミッション

    r : 読み取り権限を表します。
    w : 書き込み権限を表します。
    x : 実行権限を表します。
    \- : 対応する権限がないことを表します。

  • 5-7文字目: 所有者のグループのパーミッション
    同様にr、w、x、-のいずれかを持つ場合があります。

  • 8-10文字目: 他のユーザーのパーミッション
    同様にrwx-のいずれかを持つ場合があります。

chmodコマンドはchmod mode fileのように使います。modeには変更したいパーミッションを表す数値または記号を指定します。

chmod 755 file.txt

パーミッションの情報は、

  • 読み取り権限 r : 4
  • 書き込み権限 w : 2
  • 実行権限 x : 1
    として、足し算し、modeを決めます。この場合はmodeは、所有者(user)が、1 + 2 + 4 = 7で、所有者のグループ(group)は、1 + 4 = 5、他のユーザー(others)は1 + 4 = 5という具合で、755です。

chown 所有者や所有者のグループを変更

chownは「change owner」の略称です。ファイルやフォルダのオーナーやグループを変更します。

$ chown [options] owner[:group] file

例えば、

$ chown user file.txt

で、file.txtのオーナーをuserに変えることができます。

chown user:group 所有者と所有者のグループを同時

$ chown user:group file.txt

上記の例では、file.txtの所有者をuserに、所有者のグループをgroupに変更します。

chown -R 再帰的に所有者を変更する

$ chown -R user directory

directory以下のすべてのファイルとディレクトリの所有者をuserに変更します。-Rオプションを使用することで、ディレクトリ内のすべてのファイルやサブディレクトリも再帰的に所有者が変更します。

ln ハードリンクを作る

シンボリックリンクやハードリンクを作成できます。
シンボリックリンクとハードリンクについては解説記事は以下などを参照してください!

ハードリンクの作成

$ ln /path/to/target link_name

でハードリンクを作成できます。この場合、/path/to/targetへのハードリンクをlink_nameという名前で作成します。

ln -s シンボリックリンクの作成

$ ln -s /path/to/target /path/to/directory/link_name

-sオプションでハードリンクを作成できます。この場合、/path/to/targetへのシンボリックリンクを、/path/to/directoryディレクトリ内にlink_nameという名前で作成します。

man マニュアル表示

コマンドのマニュアルページを表示させるのがmanコマンドです。

$ man [section] keyword

のように使います。

コマンドのマニュアルページを表示する

$ man ls

LS(1)                       General Commands Manual                      LS(1)

NAME
     ls – list directory contents

SYNOPSIS
     ls [-@ABCFGHILOPRSTUWabcdefghiklmnopqrstuvwxy1%,] [--color=when]
        [-D format] [file ...]

DESCRIPTION
     For each operand that names a file of a type other than directory, ls
     displays its name as well as any requested, associated information.  For
     each operand that names a file of type directory, ls displays the names
     of files contained within that directory, as well as any requested,

この例ではlsコマンドのマニュアルがvim表示されます。
マニュアルページを閲覧した後はqキーを押すことで終了できます。

キーワードを検索してマニュアルページを表示する:

$ man -k network

-kオプションを使用することで、キーワード「network」に関連するマニュアルページの概要を表示します。

less more vi テキストファイル表示

表示だけならlessを、編集したい場合はviコマンドを使います。マウスやトラックパッドに触れなくて良い点で、エディタで編集するよりこれらのコマンドが好む方が一定数います。

less テキストファイルの表示

lessコマンドは、テキストファイルの内容をページ単位で表示します。
スクロールや検索ができます。
ファイルの先頭から表示し、ページ単位で下にスクロールします。
fで1ページ下に、bで1ページ上に送ります。
動画のように複数ファイル表示する場合は:nで次のファイルを表示できます。
終了したい時は:qと入力します。

エディタを使うからlessコマンドなんていらないでしょ?と思ったあなた。パイプ|と併用すれば、出力を快適に読むことができます。

file imgs/* | less
imgs/1.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 
1080x1350, components 3
imgs/2.jpg:  JPEG image data, JFIF standard 1.01, resolution (DPI), density 300x300, segment length 16, progressive, preci
sion 8, 735x1102, components 3
imgs/3.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, progressive, precisi
on 8, 736x919, components 3

more テキストファイルの表示

lessmoreに比べ多機能を備えており、moreの完全上位互換ですので、古いmoreコマンドは紹介するに留めます。
less:qを入力しないと終了しないのに対し、moreはファイルの終端に到達すると、終了します。

vi テキストファイルの閲覧と編集

viコマンドは、ファイルの表示と編集ができます。
テキストファイルを行単位で表示します。
カーソル移動で閲覧の「NORMAL」モードと、編集の「INSERT」モード、:で、コマンドを入力する「COMMAND」モードがあります。「COMMAND」モードでは、「終了」の:qや「INSERT」モードに切り替える:i、保存する:wなどがあります。
vimの解説は語ると長いので、こちらの記事をご参考ください。

Vimmer
Vimを使いこなす人は「Vimmer」と呼ばれます。Vimを愛用し、その独特の操作スタイルやカスタマイズ能力に熱中する人々を指します。Vimの操作方法は初学者にはやや学習コストがかかりますが、熟練すると、IDEや特別なエディタなしに、より高速かつ効率的なテキスト編集ができるようになります。

make よく使う複数のコマンドを1行で実行

よく使う複数のコマンドをまとめておいて、1行で実行するのに便利なコマンドです。
主にソースファイルのコンパイルで用いられますが、それ以外の用途でももちろん使えます。
実行するにはmakefileという名前のファイルが必要で、言語はシェルスクリプトで記述します。
makeとかmake ターゲット名のような形で実行します。
ターゲットとは下の例で言うところの、installrunstartのことです。
make runならrunに書いたコマンドが、makeのようにターゲットを省略すると一番上のinstallが実行されます。
.ONESHELLは、makefile内のすべてのコマンドが単一のシェルスクリプトで実行されるようになるおまじないです。

makefile
.ONESHELL:

# Command to install packages using pip
INSTALL_PACKAGES = pip install -r requirements.txt

install: 
    $(INSTALL_PACKAGES)
main: 
    python main.py
start: install main

c言語のプログラムのビルドにmakeを使う方法は、以下などを参照してください。

wc 行数、単語数、バイト数、(文字数)を数える

ファイルの行数、単語数、バイト数を数えるコマンドです。

$ wc sample?.txt
      20      20     145 sample1.txt
       2       2      13 sample2.txt
       1       1       7 sample3.txt
      23      23     165 total

sample1.txtに注目すると、20,20,145がそれぞれ、行数、単語数、バイト数です。
オプションを用いると希望する情報だけ表示できます。

オプション 説明
-l ファイルの行数を表示
-w ファイルの単語数を表示
-c ファイルのバイト数を表示
-m ファイルの文字数を表示
-L ファイル内の最長行の長さを表示
$ wc -m sample1.txt 
     151 sample1.txt

パイプ|と併用して使われることが多いです。

$ ls -l | wc -l
    3

pbcopy clip クリップボードにコピー

pbcopy < sample1.txt

で、クリップボードにコピーできます。
macはpbcopy、Windowsではclipというコマンドが用意されています。
パイプ|との相性がいいです。

ls -l | pbcopy 

また、最初の例は

echo sample1.txt | pbcopy

でも同じことです。

alias コマンドに独自の別名を定義

長くて毎度打つのが面倒なコマンドは別名を登録しましょう。

$ alias エイリアス名="登録したいコマンド"

でエイリアス(=別名)を登録できます。
筆者の愛用エイリアスは、

$ alias pyvenv='python3 -m venv venv && . venv/bin/activate'

です。Python仮想環境を作ってactivateまで一気に行います。

また、登録したエイリアスはaliasコマンドで確認できます。

$ alias
alias g='git'
alias ga='git add'
alias gd='git diff'
alias gs='git status'
alias gp='git push'
alias gb='git branch'
alias gst='git status'
alias gco='git checkout'
alias gf='git fetch'
alias gc='git commit'

エイリアスの削除はunaliasです。

.bashrcと.bash_profileについて
環境変数ailasの設定には.bashrc.bash_profileの理解がある方が望ましいです。
.bash_profile はログイン時のみの実行で.bashrc は対話モードの bash 起動時に毎回実行されます。
詳しく書くと長くなるので、以下の記事をご参考ください。

curl wget URLを使用してファイルをダウンロード

URlを用いてネット上のファイルをダウンロードできます。
以下は、GoogleのホームページのHTMLファイルを取得しています。

$ curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

curlは標準出力に結果を出力し、wgetはファイルを直接保存します。

open Finderで開く

macユーザーであれば、

$ open ディレクトリorファイル名

で、Finderを表示させることができます。

Finder上のファイルパスを取得

Finderで選択したファイルに対して、option + command + Cで、ファイルのフルパスを取得できます。

history コマンド履歴

Ctrl + R で入力した履歴を検索できます。
-c:コマンド履歴をクリアします。履歴を削除した後、現在のセッションで実行されたコマンドのみが表示されます。
-w:現在のコマンド履歴をファイルに保存します。デフォルトでは、コマンド履歴はセッションの終了時に自動的に保存されますが、このオプションを使用すると手動で保存できます。

$ history
  1  ls
  2  cd Documents
  3  cat file.txt
  4  cp file.txt backup.txt
  5  rm file.txt
  6  history

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

ファイルやディレクトリ検索のためのコマンドです。条件に応じた検索ができます。

$ find 検索先ディレクトリ -name "ファイル名"

sample/
 ├ foo/
    ├ hoge.py
    └ hogehoge.py
 └ bar.py

このような構造のディレクトリに対して、

sample $ find . -name "*.py"
./foo/hogehoge.py
./foo/hoge.py
./bar.py

sample $ find foo -name "*.py"
foo/hogehoge.py
foo/hoge.py

のような使い方ができます。ここで、*はワイルドカードの意味です。

$ find 検索先 -size ±ファイル容量

「検索先」で指定したファイルサイズ以上(以下)のファイル、ディレクトリを取得できます。
-size +400kなら400kB以上の、-size -10cなら、10バイト以下のファイル、ディレクトリです。数字の前の+で以上を、-で以下を、c, k, M, G でそれぞれ B, kB, MB, GBを表します。

$ find ./ -size +400k 
./imgs
./imgs/352320.jpg
./imgs/353060.jpg
./imgs/344737.jpg
./imgs/349435.jpg
./imgs/350313.jpg
./imgs/349965.jpg
./imgs/345525.jpg
./imgs/345927.jpg

$ find 検索先 -exec 実行したいコマンド {} \;

検索したファイルやディレクトリに対して、-exec オプションでcplsなどの任意のコマンドを実行することができます。

$ find ./imgs/* -type f -size -9k -exec file {} +;
./imgs/pic1.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 225x225, components 3
./imgs/pic3.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 231x500, components 3

詳しく

{}には、findで探してきたファイルやディレクトリが入るイメージ。
;は、-execの実行するコマンドの終わりはセミコロンで区切るというルールに基づきます。
\でエスケープしているのは、;は通常、「複数コマンドを続けて実行」する意味があるからです。
上記の例では9kB以下のファイルを検索し、ファイル形式や縦横サイズを取得する、file コマンドを実行しています。

locate 高速なファイルやディレクトリ検索

locatefindより高速ですが、事前に作成されたデータベースからファイル名やパターンにマッチするファイルを検索するので、最新の情報とは異なる場合があります。大量のファイルを検索したいだけの時に使えます。-execのようなオプションはありません。
$ locate [オプション] [検索パターン]と使用します。
locateコマンドを初めて使うと、

$ locate -l 5 'bashrc'

WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:

  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.

のような

$ locate -l 5 'bashrc'
/System/Library/Templates/Data/private/etc/bashrc
/System/Library/Templates/Data/private/etc/bashrc_Apple_Terminal
/private/etc/bashrc
/private/etc/bashrc_Apple_Terminal

grep : ファイル内の文字列を検索

$ grep [オプション] '検索文字列' 対象ファイル

の使い方で、ファイル内の文字列を検索します。

$ grep -n "AP" sample/sample2.txt
1:APPLE

便利なオプションの一部を紹介すると、

オプション 説明
-n マッチした行の行番号を表示
-i 大文字小文字を区別せずに検索
-r ディレクトリ内の全てのファイルを再帰的に検索
-l ファイル名だけを表示

などがあります。

以下で使用例を紹介します。

$ ls sample
sample1.txt     sample2.txt     sample3.txt
$ cat sample/sample1.txt
apple
$ cat sample/sample2.txt
APPLE
BANANA
$ cat sample/sample3.txt
orange

このような中身のsampleディレクトリに対して、

$ grep -rl "ap" sample
sample/sample1.txt
$ grep -irl "ap" sample
sample/sample1.txt
sample/sample2.txt

のように該当文字列のあるファイル名を取得することができます。

その他オプションについては以下をご参考ください。

df du ps ディスク・システムの容量の使用状況

ディスクおよびシステムの容量がどれだけ使用されているかを確認できます。

df ファイルシステムの使用状況

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       10485760 3776328   6169432  38% /
tmpfs             524288       4    524284   1% /tmp
/dev/sdb1        2097152  524288   1572864  25% /home

以下は、各カラムが、ファイルシステム・ディスクパーティションにとって持つ意味の説明です。

カラム名 説明
1K-blocks(1キロバイトブロック数) 総容量をキロバイト単位で表示します。この値は、ファイルシステムが利用可能な総容量です。
Used(使用済み) 使用されている容量をキロバイト単位で表示します。現在のディスク使用量です。
Available(利用可能) まだ利用可能な容量をキロバイト単位で表示します。現在のディスクの空き容量です。
Use%(使用率) 使用率のパーセンテージです。
Mounted on(マウントポイント) ファイルシステムまたはディスクパーティションがマウントされている場所を示します。ディレクトリのパスとして表示されます。

また、-hオプションで、GK表記でサイズを見やすく整形してます。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       9.5G  3.6G  5.9G  38% /
tmpfs           512M  4.0K  512M   1% /tmp
/dev/sdb1       2.0G  512M  1.5G  25% /home

ファイルシステム
ファイルシステムは、OSが提供するデータ管理のためのデータ構造やアルゴリズムのセットのことです。一般的なファイルシステムの例としては、WindowsでのNTFSやFAT、Linuxでのext4やXFS、macOSでのHFS+やAPFSなどがあります。詳しくは以下の記事などをご参考ください。

du ディスク使用量

ディスク使用量をディレクトリごとに集計して表示するコマンドです。

$ du
8       ./.vscode
24      .

最初の数字が、ファイルまたはディレクトリのパスのディスク使用量です。
du directory_nameの形でディレクトリを指定できます。その場合、そのディレクトリおよび全てのサブディレクトリの使用量を集計します。なお、ディレクトリを省略すると、カレントディレクトリが指定されます。
ファイル名を指定することもでき、その場合該当のファイルのディスク使用量が表示されます。

ps 実行中のプロセス情報

$ ps
  PID TTY          TIME CMD
 1234 pts/0    00:00:01 bash
 5678 pts/0    00:00:00 ps

以下は各カラムの説明です。

カラム名 説明
PID(Process ID) プロセスの一意の識別子。
TTY(Terminal) プロセスが実行されている端末デバイス(ターミナル)の情報。
TIME プロセスが実行されている総CPU時間。
CMD(Command) プロセスを起動したコマンドまたはプログラムの名前。

以下はオプションの説明です。

オプション 説明
-e 全てのプロセスの表示。
-l 詳細な情報を表示。
-u 指定したユーザに関連するプロセスのみを表示。
-p 指定したプロセスIDに関連するプロセスのみを表示。
-r 実行中のプロセスのみ表示。

ncdu

インストールが必要なduの上位コマンドを紹介します。ファイルサイズやファイル数が見やすく、vimみたいな感じで、サイズの大きいファイルを十字キー使いながら探すことができます。

インストール方法
$ sudo apt-get install ncdu # Debian系
$ sudo yum install ncdu  # RedHat系
$ brew install ncdu # macOS/Homebrew
$ sudo port install ncdu # macOS/MacPorts

スクリーンショット 2023-04-21 11.00.57.png

uniq 重複行の削除

$ uniq file.txt

file.txtの隣り合った重複する行を削除できます。ただし、保存先を指定しなければ標準出力に結果を書き出します。
変更内容を保存するには、

$ uniq file.txt > file_modified.txt

などとしましょう。
なお、重複した行数を表示するuniq -c file.txtや、重複した行だけ出力するuniq -d file.txtも存在します。
もちろん、コマンドの出力を引数にパイプ|を用いることもできます。

sort テキストファイルを行単位で並び替え

$ sort file.txt

アルファベット順に従って行を並び替え標準出力に表示します。-rオプションで逆順に、-fオプションで大文字小文字区別なしのソートができます。
duコマンドなどとパイプ|で組み合わせることでサイズ順に表示することもできます。

diff 二つのファイルの差分を表示

二つのファイルの差分を表示します。-qオプションを使えば簡潔に二つのファイルが全く同一かどうかだけを確認できます。

$ cat sample1.txt
orange
orange
tomato
apple
$ cat sample2.txt
orange
tamago
tomato
applo
$ diff sample1.txt  sample3.txt 
2c2
< orange
---
> tamago
4c4
< apple
---
> applo

cmp バイトレベルの差異

$ cmp file1.txt file2.txt
file1.txt file2.txt differ: byte 13, line 1

file1.txtfile2.txtの内容をバイトレベルで比較し、差異を出力します。差異がなければ出力はされません。

オプションは、以下のものがあります。

オプション 説明
-s 差異がある場合1を、ない場合0を出力、エラーコードは2を出力。
-b 行の終わりや空白の扱いを無視。
-l 差異のある位置とそのバイト値を表示。

cut テキストファイルを横方向で分割。

cutコマンドのできることを実例で確認しましょう。
以下のようなファイルを考えます。

sample1.txt
01,John,200,California
02,Michel,800,Texas
03,Maria,100,New York
04,John,600,New York
05,David,300,Texas

-b バイト数で取り出す位置を指定

各行の文字を取り出す位置を-bオプションで指定します。

2文字目を取り出す
$ cut -b 2 sample1.txt
1
2
3
4
5

-を使えば連続複数文字取り出せます。

2~4文字目を取り出す
$ cut -b 2-5 sample1.txt
1,Jo
2,Mi
3,Ma
4,Jo
5,Da

,で区切ればは習えた範囲を指定できます。

2~4文字目と7~9文字目を取り出す
$ cut -b 2-5,7-10 sample1.txt
01,Jo,200
1,Jon,20
2,Mihel,
3,Maia,1
4,Jon,60
5,Daid,3

終端を指定しなければ、最後尾まで取り出します。

5文字目以降を取り出す
$ cut -b 5- sample1.txt
ohn,200,California
ichel,800,Texas
aria,100,New York
ohn,600,New York
avid,300,Texas

-d 区切り文字を指定

区切り文字を指定できます。他のオプションと組み合わせて使います。

-f 取り出す項目(カラム)の数を指定

-bと同じような仕様で項目数を指定します。

$ cut -d "," -f 3 sample1.txt 
200
800
100
600
300
$ cut -d "," -f 2-5 sample1.txt 
John,200,California
Michel,800,Texas
Maria,100,New York
John,600,New York
David,300,Texas

出力を保存

出力は標準出力に表示されるだけなので、保存したいときは>を使います。

$ cut -d "," -f 2-5 sample1.txt > sample2.txt

sed 文字列置換、抽出、削除

-e "s/置換前文字列/置換後文字列/"

下記のようなファイルを考える。

sample1.txt
01,John,2000,America/California
02,Michel,8000,America/Texas
03,Maria,1000,America/New York
04,John,6000,America/New York
05,David,3000,America/Texas

-eオプションに"s/置換前文字列/置換後文字列/"で指定します。

$ sed -e "s/000/k/" sample1.txt 
01,John,2k,America/California
02,Michel,8k,America/Texas
03,Maria,1k,America/New York
04,John,6k,America/New York

"s/置換前文字列/置換後文字列/"/はなんでも構いません。置換対象に含まれていない特殊文字を指定するのがこつです。/が含まれている"America/"He is in "に置換したい場合を考えましょう。"s/America//He is in /"だとうまくいきません。"s/America\//He is in /"とエスケープしても良いですが、

$ sed -e "s@America/@He is in @" sample1.txt 
01,John,200,He is in California
02,Michel,800,He is in Texas
03,Maria,100,He is in New York
04,John,600,He is in New York
05,David,300,He is in Texas

のように@区切りにすることで見やすくなります。

gをつけることで、行に複数出てくる文字を全て指定できます。"s/置換前文字列/置換後文字列/g"としないと各行の最初に出てくる置換対象文字列だけ置換されます。

#gを指定する場合
$ sed -e "s@,@\t@g" sample1.txt
01      John    2000    America/California
02      Michel  8000    America/Texas
03      Maria   1000    America/New York
04      John    6000    America/New York
05      David   3000    America/Texas
# gを指定しない場合
$ sed -e "s@,@\t@" sample1.txt
01      John,2000,America/California
02      Michel,8000,America/Texas
03      Maria,1000,America/New York
04      John,6000,America/New York
05      David,3000,America/Texas

-e "3d" 3行目を削除

"3d"で3行目を削除できます。"1,4d"で1~4行目を削除、"/$d"で最終行を削除できます。

$ sed -e "3d" sample1.txt 
01,John,2000,America/California
02,Michel,8000,America/Texas
04,John,6000,America/New York
05,David,3000,America/Texas

-i 直接編集

-eオプションは標準出力に表示するのに対し、-iにすると直接ファイルを編集できます。

その他

sedコマンドには他にもできることがたくさんあります。以下は参考記事からの引用です。

コマンド 説明
= 現在の行番号を出力します。
# コメント
a 文字列 指定した位置の後ろに文字列を追加します。(改行する場合は改行前の文字列に/を付ける。)
i 文字列 指定した位置の後ろにテキストを挿入します。(改行する場合は改行前の文字列に/を付ける。)
c 文字列 選択した行をテキストに置き換えます。(改行する場合は改行前の文字列に/を付ける。
q 入力を中断し、それ以上処理を行わず終了します。(※未出力分があれば出力してから終了します。)
d 指定した行を削除します。
p 処理した内容を出力します。-n オプションと組み合わせて使うことがあります。
P 処理した内容を出力します。
r ファイル名 ファイルを先頭に追加します。
s/置換前文字列/置換後文字列/ (置換前文字列)で指定した文字列にマッチした部分を置換後文字列へ置き換えます。また複数マッチした場合は先頭のみ置換を行い、対象全て置換を行う場合は"s/置換前/置換後/g"のように-gオプションを併用します。
y/元の文字列/対象文字列/ (元の文字列)のものを(対象文字列)の同じ位置に存在する文字列に置換します。(※trコマンドのように使用可能です。)

以下の記事をご参考ください。

ssh scp リモートマシンとやりとり

ssh リモートマシンに接続

$ ssh [オプション] [ログイン名@]接続先 [接続先で実行したいコマンド]の書式でリモートマシンに接続します。DeepLearningの文脈ならGPUに接続する際に登場します。
~/.ssh配下にconfigファイルを作成すると簡単にリモートマシンとssh接続できます。

config
Host example
    HostName example.com #IPアドレスでも可
    User myusername
    Port 22
    IdentityFile ~/.ssh/id_rsa

各項目の説明です。

項目 説明
Host ホストのエイリアスを指定。
HostName ホスト名またはIPアドレスを指定。
User 接続する接続先のユーザ名を指定。
Port 接続するポート番号を指定。
IdentityFile 認証に使用するローカルの秘密鍵ファイルのパスを指定。

IdentityFile

ls ~/.ssh

で見つけることができます。

ssh host_name

接続にはローカルPCの公開鍵が必要です。

$ ls ~/.ssh/

scp ローカル・リモート間でファイルのコピー

ローカルのファイルをリモートにコピーしたりその逆ができます。

ローカルからリモートサーバーにファイルをコピー

ローカルからリモートにコピー
$ scp /path/to/local/file.txt username@hostname:/path/to/remote/

リモートサーバーからローカルにファイルをコピー

リモートからローカルにコピー
$ scp username@hostname:/path/to/remote/file.txt /path/to/local/

-r ディレクトリごとコピー

$ scp -r /path/to/local/directory username@hostname:/path/to/remote/

rsync

ファイルやディレクトリをローカル間またはローカルとリモート間で同期します。

ローカルのディレクトリを別のローカルのディレクトリに同期する

$ rsync -av /path/to/source/ /path/to/destination/

-a, --archiveオプションは、ファイルの属性、パーミッション、タイムスタンプなどが保持されるアーカイブモードで同期します。
-v, --verboseオプションは 詳細な出力を表示します。

ローカルのディレクトリをリモートサーバーに同期する

$ rsync -av /path/to/source/ user@remote:/path/to/destination/

リモートサーバーからローカルのディレクトリに同期する

$ rsync -av user@remote:/path/to/source/ /path/to/destination/

awk 条件満たす行を表示

$ awk 'パターン { アクション }' ファイルパスの書式で実行します。
パターンには指定する行の条件を、アクションには{}で囲む表示する{print}などのコマンドを、ファイルパスには対象テキストファイルのパスを指定します。
以下のsample4.txtを使います。

sample4.txt
01	John	2000	America/California
02	Michel	8000	America/Texas
03	Maria	1000	America/New York
04	John	6000	America/New York
05	David	3000	America/Texas

$ awk '$2 == "John"' sample4.txt 
01      John    2000    America/California
04      John    6000    America/New York

$2は2行目という意味です。2行目がJohnの行をそのまま表示しています。「アクション」は省略されでファルとの{print}が呼び出されています。
アクションの種類には分割のsplitや置換のsubなどがありますが全部紹介すると多いので、以下の記事等をご参考ください。

ifconfig ネットワークインターフェースの設定

ネットワークインターフェースの設定情報を表示するため$ ifconfig インターフェース名で使用します。

$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.100  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::cdef:1234:abcd:ef01  prefixlen 64  scopeid 0x20<link>
        ether 00:11:22:33:44:55  txqueuelen 1000  (Ethernet)
        RX packets 12345  bytes 6789012 (6.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23456  bytes 7890123 (7.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
項目名 説明
inet IPv4アドレス
inet6 IPv6アドレス
netmask ネットマスク
ether MACアドレス
RX packets 受信パケット数
TX packets 送信パケット数
RX errors 受信エラー数
TX errors 送信エラー数

おわりに

弊社Nucoでは、他にも様々なお役立ち記事を公開しています。よかったら、Organizationのページも覗いてみてください。
また、Nucoでは一緒に働く仲間も募集しています!興味をお持ちいただける方は、こちらまで。

参考

https://qiita.com/reireias/items/d906ab086c3bc4c22147
https://qiita.com/magicant/items/d3bb7ea1192e63fba850
https://qiita.com/Hige-Moja/items/44bbfb14868816169978
https://qiita.com/marrontan619/items/95e954972706f32be255
https://atmarkit.itmedia.co.jp/ait/series/3065/
https://eng-entrance.com/category/linux/linux-command
https://qiita.com/takech9203/items/b96eff5773ce9d9cc9b3

809
935
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
809
935

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?