【なんとなくわかる】プログラミング初心者のためのLinuxコマンド基礎中の基礎

#はじめに

プログラミングを学び、プログラミングを上達していく上で必須なLinuxコマンドの、基礎中の基礎と言われるコマンドをまとめてみました。

LinuxもmacOSもどちらもUNIX系なのでだいたい同じコマンドがターミナルで使えます。Macを使われている方もぜひ参考にして下さい。


#【コマンド入門】

コマンドには「**引数**」が指定できます。引数の中でもコマンドの動作を変えるものは「**コマンドラインオプション**」や「**オプション**」と呼ばれます。

lsコマンド（ファイルやディレクトリの情報を表示します）の**オプション**に「**-F**」をつけて実行するとディレクトリ名の後に「/」がつきました。
![Screenshot from 2021-08-28 14-13-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732098/f57282b4-8907-5a6c-a0e2-7f1ae0007dd3.jpeg)

他にも「`ls -l`」とすると、ファイル名だけでなく日時やファイルを所有しているユーザーの情報なども表示できます。「`ls -lF`」のように同時に指定することも可能です。
![Screenshot from 2021-08-28 14-15-25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732098/ee8c98ae-ed24-ba58-942d-e47a4aef60e7.jpeg)

##コマンドの使い方を調べる
コマンドによっては使用することのできるオプションはさまざまです。コマンドごとに使用できる引数を全て覚えることは難しいので、コマンドのオプションなどは調べながら実行していくことになります。
Webで調べることもできますが、ここではコマンドのヘルプを見る方法も覚えます。

先程の「`ls`」コマンドのヘルプを見るには、「`コマンド名 --help`」として表示させます。
![Screenshot from 2021-08-28 14-18-49.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732098/377ef64a-8fb9-6925-d811-8db174505a4b.png)
他にもコマンドのマニュアルを見る方法もあります。
「`man コマンド名`」として、manコマンドの引数にコマンド名を指定します。![Screenshot from 2021-08-28 14-19-41.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732098/8c8fc54b-c48b-d5db-ede8-46b777d3d15f.png)
デフォルトでは全て英語で書かれているので、日本語のマニュアルをインストールします。
`$ sudo apt install manpages-ja manpages-ja-dev`でインストールできます。（Macのmanコマンドを日本語にしたい方がいらっしゃれば、[こちら](https://programming-try.com/2021/02/721/#toc10)のページがとても参考になりました。）
![Screenshot from 2021-08-28 14-22-01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732098/c7a96166-0cd6-67d4-9ed8-b5c210b97f89.png)
![0C1F5857-1738-44E2-A794-C3F08CAF4FFD_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732098/f39ea41f-86c1-0e28-ecec-9b99778abc6f.jpeg)
一時的に英語で表示させたい場合は`$ LANG=C.UTF-8 man コマンド名`として表示することができます。（ここでは紹介しませんが、さらに情報を詳しく表示させるような「`info`」コマンドもあります）

##sudo (スードゥー)
sudoとは**特定の管理者コマンドを実行するためのコマンド**です。
下の画像はシステムのパッケージ情報を最新にするためのコマンドの例です。
![Screenshot from 2021-08-28 15-50-18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732098/b4562eb2-1326-fbd3-5659-794a1e7c1060.jpeg)
**sudo**をつけずに実行すると「**許可がありません**」と言われ失敗してしまいます。sudoを行頭につけて実行すると、パスワードの入力を求められ管理者権限でコマンドが実行でき、アップデートが成功します。
![Screenshot from 2021-08-28 15-50-55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/732098/c67a6d43-3b49-944b-3c7c-66383672e6f5.jpeg)





#【Linuxコマンド入門まとめ】

##ターミナルに関するコマンド

### pwd
現在のディレクトリを表示します。

~~~bash
pwd     # 現在操作しているディレクトリの場所を表示
~~~
***
### cd
操作しているディレクトリを移動します。

~~~bash
cd ..          # 現在の親ディレクトリに移動

cd ~/          # ホームディレクトリに移動

cd Desktop     # 一階層下のDesktopディレクトリに移動
~~~
***
### ls
ファイルやディレクトリの情報を表示します。

~~~bash
ls          # ファイル名が.で始まるファイル以外をファイル名の順に表示

ls -a       # .から始まるファイル名を含んだファイル名を表示

ls -l       # ファイルの権限、所有ユーザー、ファイルサイズ、変更日時を表示

ls hoge*     # ファイル名の先頭にhogeを含むファイル名のみ表示
~~~
***
### find
条件に合致するファイルを探します。

~~~bash
find ディレクトリ名 -name hoge      # ファイル名にhogeを含むファイルを指定したディレクトリ、およびそのサブディレクトリから探す
~~~
***
### which, whereis
コマンドの置かれている場所の絶対パスを表示します。

~~~bash
which コマンド名       # 一般ユーザーは管理者用のコマンドを検索することはできない

whereis コマンド名     # whichでは表示されない管理者用のコマンドも表示する
~~~
***
### clear
ターミナルに表示されている画面をクリアにする

~~~bash
clear      # 一行目から入力できるようにする
~~~
***
### logout, exit
ターミナルを終了します。

~~~bash
logout     # ターミナルを終了
~~~
***
##ファイル操作に関するコマンド
### cp
ファイルやディレクトリをコピーします。

~~~bash
cp file1 file2                  # file1の内容をfile2にコピーする、file2が存在しない場合は新しくfile2を作成しコピーする（※file2の名前がfile1と一致すると上書きされてしまうため注意

cp -R directory1 directory2     # directory1をdirectory2へ丸ごとコピーする
~~~
***
### mv
ファイルやディレクトリを移動、もしくは名前を変更します

~~~bash
mv file1 file2            # file2をfile1という名前に変更する

mv file名 directory名      # 指定したファイルを指定したディレクトリへ移動する
~~~
***
### rm
ファイルを削除します。

~~~bash
rm ファイル名          # 指定したファイルを削除する

rm hoge*             # ファイル名がhogeから始まるファイルを全て削除する

rn -r　ディレクトリ名     # 指定したディレクトリとその中にあるファイルを全て削除する
~~~
***
### touch
ファイルのアクセス時刻、修正時刻の変更を行います。

~~~bash
touch ファイル名     # 指定したファイル名が存在しない場合は空のファイルを作成する
~~~
***
### mkdir
ディレクトリの作成を行います。

~~~bash
mkdir ディレクトリ名                    # 指定したディレクトリ名でディレクトリを作成

mkdir -p directory1/directory2     # directory1の中にdirectory2を作成
~~~
***
### rmdir
ディレクトリを削除します。ただし空のディレクトリでないと削除されません。

~~~bash
rmdir ディレクトリ名     # 指定した空のディレクトリを削除する
~~~
***
### tar
ファイルやディレクトリを一つのアーカイブ（記録を保管しておく場所）にまとめて格納したり、それを解凍したりします。
主にソースファイル一式をやり取りする場合などに使われます。

~~~bash
tar cvf hoge.tar *     # 現在のディレクトリにあるファイルやディレクトリ全てをhoge.tarにまとめて格納する

tar xvf hoge.tar       # hoge.tarを解凍する
~~~
***
### gzip, gunzip
Linuxで用いられることの多い圧縮方法のファイルの圧縮、解凍を行います。

~~~bash
gzip hoge.js           # hoge.jsファイルを圧縮しhoge.js.gzを作成、元のファイルは削除する

gunzip hoge.js.gz      # hoge.js.gzを解凍する
~~~
***
### zip, unzip
windowsで用いられることの多い圧縮方法のファイル圧縮、解凍を行います。

~~~bash
zip hoge.zip hoge.js     # hoge.jsファイルをhoge.zipとして圧縮する

unzip hoge.zip          # hoge.zipファイルを解凍する
~~~
***
##ファイルの中身を見たり操作したりするコマンド
### cat
ファイルの内容を連結して一気に表示します。

~~~bash
cat ファイル名                   # ファイルの内容を表示

cat file1 file2 > newfile     # file1,file2の内容をnewfileファイル一つにまとめる
~~~
***
### wc
ファイルの行数、単語数、バイト数を表示します。

~~~bash
wc -l ファイル名     # 行数とファイル名のみ表示する
~~~
***
### less
ファイルの内容を１画面ずつ表示します。

~~~bash
less ファイル名     # 表示を終了させる時はqキーを押す
~~~
***
### diff
２つのファイルの違いを探します。

~~~bash
diff file1 file2         # file1からfile2に対してどこが変更されたのかが表示される。（削除された行は先頭に<、追加された行は先頭に>がついて表示される）

diff -b file1 file2      # スペースの数が違うだけの場合は違いを無視する。

diff -B file1 file2      # 空行があるかどうかについては違いを無視する。
~~~
***
### file
ファイルのタイプを表示します。

~~~bash
file ファイル名     # ソースファイルなのか実行ファイルなのかなどを表示
~~~
***
### grep
指定した文字や単語などが含まれている行を表示します。

~~~bash
grep hoge ファイル名          # hogeという単語が含まれている行を探す

grep -C n hoge ファイル名     # hogeをという単語の前後n行も表示

grep -c hoge ファイル名       # hogeを含む行数を表示

grep -i hoge ファイル名       # 大文字と小文字の区別を無視する
~~~
***
### tail
ファイルの末尾の部分を表示します。

~~~bash
tail ファイル名           # オプションを指定しない場合デフォルトでは最後の10行を表示する

tail -n n ファイル名      #ファイルの最後の行数n行を表示する

tail -f ファイル名        #ファイルの末尾が更新される度に表示し続ける（logを継続して監視する場合などに使用する）
~~~
***
##プロセスに関するコマンド
### ps
現在実行されているプロセスを表示します。psコマンドで表示された一番先頭にある数字が、**PID**（プロセス番号）です。この後出てくる**killコマンド**で必要になります。（psコマンドには「-」が付くオプションとそうでないオプションがありますが、「-」が付かないオプションの利用が推奨されているそうです）

~~~bash
ps             # 現在実行されているプロセスを表示する

ps ax          # システム上で実行されているプロセス全てを表示する
~~~
***
### kill
プロセスを終了させます。**psコマンド**で確認した**PID**（プロセス番号）を入力します。
killコマンドには**シグナル**というものがあります。プロセスはシグナルを受け取ると、受け取ったシグナルに応じた動作で反応します。シグナルには番号が付けられており、例えば**強制的に終了**させるシグナルは「**９**」となっています。

~~~bash
kill プロセス番号         # デフォルトではシグナル番号「１５」でプロセスを終了させる

kill -9 プロセス番号      # シグナル番号「９」で強制的に終了させる
~~~
***
##その他のコマンド
###date
現在の時刻を表示します。

~~~bash
date      # 現在の日時を秒単位まで表示する
~~~
***
###curl
Webで公開されているファイルをダウンロードする時に使用したり、さまざまなプロトコルを利用してデータの転送を行うことができます。

~~~bash
curl -O ファイルのurl      # 指定されたurlのファイルをダウンロードして同じ名前のファイルに保存する
~~~
***
###crontab
コマンドを定期的に自動で実行する時に使用します。
設定書式は `* * * * * コマンド`のように設定します。ここで「 * 」はそれぞれ
`分　時　日　月　曜日`に対応し数字で指定します。曜日は０または７が日曜日で、後は１〜６までが順に月曜日から埋まっていきます。月曜日が１で土曜日が６です。
**`crontab -e`**でcrontab設定ファイルを開き、そこに定期的に実行したいコマンドを記述していきます。**`crontab -l`**で現在設定されている設定を確認できます。

~~~bash
15 20 * * * /usr/local/bin/backup      #　毎日８時１５分にバックアップを取る

30 12 * * 3 /usr/local/bin/backup      # 毎週水曜日の１２時３０分にバックアップを取る
~~~
***
#おわりに

ここまで紹介したコマンド以外にもまだまだたくさんのコマンドがあり、１つ１つのコマンドに大量のオプションが付いています。いきなり全て覚えて使いこなすことは難しいと思うので、「こんなコマンドがあるんだなあ〜」程度に参考にしていただければ幸いです。

参考にさせていただいた書籍はこちらです。
・[Ubuntuスタートアップバイブル]
(https://www.amazon.co.jp/Ubuntu%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB-%E5%B0%8F%E6%9E%97-%E6%BA%96-ebook/dp/B07FS2NRKK/ref=sr_1_1?adgrpid=103870342466&dchild=1&gclid=CjwKCAjwmqKJBhAWEiwAMvGt6Fwe4WnXOqvHlXoSUq2QAKoUETnLuWIjG14FiRvBgAQZZAkVbUfRGhoCnTgQAvD_BwE&hvadid=448604013349&hvdev=c&hvlocphy=1009540&hvnetw=g&hvqmt=e&hvrand=8578222445061772425&hvtargid=kwd-333356161402&hydadcr=27270_11561194&jp-ad-ap=0&keywords=ubuntu%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB&qid=1630129183&sr=8-1)
・[Linux入門の入門]
(https://product.rakuten.co.jp/product/-/e2262e90527eacfc6be75a54b9c4953c/?gclid=CjwKCAjwmqKJBhAWEiwAMvGt6GM2sshHymjiNvTTYuFEciIwUiZPSf37T37B6K2i9sxaJD2Iy0nP8xoCF_AQAvD_BwE&gclsrc=aw.ds&gclsrc=aw.ds&icm_acid=861-767-4285&icm_agid=24053784687&icm_cid=252516927&icm_kw=&icm_mt=&icm_tgid=pla-84798449282&scid=s_kwa_pla_boo_252516927)
・[Linux教科書 LPICレベル1 Version5.0対応]
(https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-Version5-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C/dp/4798160490/ref=asc_df_4798160490/?tag=jpgo-22&linkCode=df0&hvadid=295678107984&hvpos=&hvnetw=g&hvrand=11578099055683212713&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009540&hvtargid=pla-649269108462&psc=1&th=1&psc=1)

ありがとうございました！