開発者なら知っておくべき 11 のコンソールコマンド

>こちらの記事は、[Indrek Lasn](https://medium.com/@indreklasn?source=post_page-----54e348ef22fa----------------------) 氏により2019年 11月に公開された『 [Here Are 11 Console Commands Every Developer Should Know
](https://medium.com/better-programming/here-are-11-console-commands-every-developer-should-know-54e348ef22fa) 』の和訳です。
本記事は原著者から許可を得た上で記事を公開しています。

コマンドラインをうまく使えば、いくつかのありふれたタスクを自動化し、よりスムーズに処理を実行することが可能になり、日々の生産活動をより効率化できます。GUI上でクリック操作する代わりに、いくつかのコマンドを実行するだけでジョブを完了させることが可能です。

Unix shell はUnixライクなOS向けにコマンドラインユーザーインターフェースを提供する、コマンドラインインタプリター、またはshellです。shellはインタラクティブなコマンド言語かつスクリプト言語でもあり、OSがshellスクリプトを用いてシステムの実行を制御するために使用されます。

すべてのLinuxやMacベースのOSにはデフォルトでコマンドラインがインストールされており、一般的には「ターミナル」と呼称されます。コマンドライン（CLI）によってファイルの移動や名前の変更、データの並び替えやコンピュータ内の移動をより簡単に行えます。

では早速あなたのエンジニアライフをより楽にする “11” のコマンドを紹介します。

# 1. grep

```Bash
$ grep "some string" file
```

`grep`コマンドは各ファイルの文字列を検索します。また、改行文字で区切られたパターンも検索し、パターンに一致する行をそれぞれ出力します。

![1_ovG5it9EJTZ0JG3tdOgclA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/2004a820-4f92-e5df-8b2d-f777baada4d0.png)
<CENTER>`grep` でファイル内の React という文字列を検索する<CENTER>
<br>
`-i` オプションを使用すると、指定したファイル内の大文字と小文字を区別せずに文字列を検索できます。この場合「REACT」、「REact」、「react」などの文字列を検索します。

```Bash
$ grep -i "REact" file
```

`-c` （count）オプションを使用すると、指定された文字列/パターンがファイル内で何回記載されているかがわかります。

```Bash
$ grep -c "react" index.js
```
![1_-KL9UvoB8RR4NKkUfHNBoQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/95734f7c-9e3d-1e10-b809-4bdc689dbb42.png)
<DIV ALIGN=CENTER>`grep -c` コマンドで react の 記載回数をカウント</DIV>
<br>
これは私がインターネットで見つけた、`grep`コマンドに関する楽しくてためになるイラストです。

![1_ZkpszLnLQFRFp_cVO_Ldmw.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/4ddfe783-3866-6ae5-8243-4f1d4501e08c.jpeg)
Source: [Wizard Zines](https://wizardzines.com/zines/bite-size-command-line/)

また、異なるコマンドの `egrep` および `fgrep` は、それぞれ `grep -E` および `grep -F` と同様のコマンドです。これらのバリアントは非推奨ですが、下位互換性のために提供されています。

`grep` では多くのことを行えます。--より深く理解するためには[このドキュメント](http://man7.org/linux/man-pages/man1/grep.1.html)を読んでください。

# 2. ls
```Bash
$ ls
```
`ls` コマンドはパス内のファイルとディレクトリを一覧表示します。パス名がファイルの場合、`ls` コマンドは要求されたオプションに従ってファイルに関する情報を表示します。

パス名がディレクトリの場合、`ls` コマンドはディレクトリ内のファイルとその中のサブディレクトリに関する情報を表示します。

![1_JthCA8XeIN22yScYBJlRIw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/8840f766-610f-6726-fb0c-559295f93d2e.png)
<DIV ALIGN=CENTER>`ls` でパス内のすべてのディレクトリとファイルを表示</DIV>
<br>
フォルダが青色で表示されているのに対し、ファイルはグレーで表示されていることに気づいたかもしれません。これは、フォルダとファイルを区別するのに役立ちます。

# 3. pwd
```Bash
$ pwd
```
![1_E1zXuIQ6X0aaTtVC0wZ_nw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/e1e82e5f-4dab-363c-8228-ef9f15a10550.png)
<DIV ALIGN=CENTER>`pwd` で作業ディレクトリの絶対パスを表示</DIV>
<br>
`pwd` コマンドは、現在の作業ディレクトリを出力するコマンドです。現在の作業ディレクトリの完全なシステムパスを標準で出力します。オプションで現在のディレクトリの完全な物理パスを表示できますが、デフォルトでは、`pwd` コマンドはシンボリックリンクを無視します。

# 4. cat
```Bash
$ cat somefile.js
```
![1_SL7g1NHsb7dKgwmoYBySkQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/af84ddf2-213c-d165-9453-81bc71bd9ffe.png)
<DIV ALIGN=CENTER>`cat` でファイルの内容を表示</DIV>
<br>
`cat` コマンドには、テキストファイルに関する3つの関連機能があります。

 - テキストファイルの内容を表示する
 - テキストファイルのコピーを結合する
 - 新しいテキストファイルを作成する

`cat` コマンドの最も一般的な使い方は、ファイルの内容を読み取ることであり、多くの場合この目的に最も便利なコマンドです。

以下の例では、`cat` の標準出力は、出力リダイレクト演算子（ `>` で表されます）を使用してfile2にリダイレクトされます。

```Bash
$ cat somefile > somefile2
```

![1_NxLOMigqozU5EvxVdr1f7Q.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/56f9a756-abaf-14b3-f329-de5bf27adaf0.png)
<DIV ALIGN=CENTER>`cat` を使ってファイルを作成する</DIV>

# 5. echo
```Bash
$ echo "some text"
```
Linux の `echo` コマンドは、引数として渡されたテキスト/文字列を表示するために使用されます。`echo` コマンドは主にシェルスクリプトやバッチファイル内で使われ、ステータス情報のテキストを画面やファイルに出力します。 

![1_1bMjVqwhueQP5hvyMMdDKA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/f19875af-5671-ce79-def6-0cae4cca447a.png)

# 6. touch
```Bash
$ touch somefile
```
`touch` コマンドは空ファイルを作成するために使用されます。`touch` コマンドは、ユーザーがファイル作成時点ではデータを保存する必要がない場合に使用されます。
![1_RIrUCSW4TT_cJrnGy9ighQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/0ff37437-fb55-54fe-21df-abb4ada27929.png)
<DIV ALIGN=CENTER>`touch` で新しいファイルを作成</DIV>
<br>
上の図では`touch` を使ってファイルを作成し、`cat` でファイルの内容を確認しています。新しく作成されたindex2.jsファイルは空なので、`cat` は何も返しません。

以下は`cat` と `touch` の主な違いです：

- `cat` — コンテンツを含むファイルを作成するために使用されます。
- `touch` — コンテンツ無しまたは空ファイルの状態でファイルを作成します。`touch` コマンドで作成したファイルは空だということに注意してください。このコマンドは、ユーザーがファイル作成時点で保存するデータがない場合に便利です。

# 7. mkdir
```Bash
$ mkdir some-directory
```
単語から推測できる通り、`mkdir` は現在のアクティブパスに新しい空のディレクトリを作成します。テキストエディターやGUI上でクリックする代わりに、このコマンドを使用して新しいフォルダーを作成します。
![1_FsxDBW5HDWJn9kHsw0My7A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/6edb7aa3-c0c5-c2fc-be82-58047a8d9918.png)
<DIV ALIGN=CENTER>`mkdir` で新しいディレクトリを作成</DIV>
<br>
注：前述の`ls` コマンドでディレクトリ内をどのように覗くことができるか確認してみてください。

# 7.1 rm
```Bash
$ rm someFile
```
`rm` はremoveの略で、まさにそのまま言葉通りのことをします。つまり、ファイルを取り除く、別の言葉で言えば、削除します。

![1_damLEKdyWY7aBPILFELVNg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/936a1cdf-081a-76aa-f752-7e710c199844.png)
<DIV ALIGN=CENTER>`rm` コマンドでファイルを削除</DIV>
<br>
デフォルトでは、`rm` コマンドはディレクトリを削除しません。ディレクトリを削除するには、`(rm) -rf` オプションを渡す必要があります。

```Bash
$ rm -rf some-directory
```
![1_gXTLAllsEVTdWHCcDw83WQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/4d2a476b-de41-c9a7-56c4-fc4c7244b83e.png)
<DIV ALIGN=CENTER>`rm -rf` でディレクトリを削除（ディレクトリ削除のためのオプションを付与）</DIV>
<br>
注：このコマンドにより、ディレクトリにコンテンツが含まれているかどうかに関係なくディレクトリが無条件に削除されます。

# 7.2 rmdir
```Bash
$ rmdir some-directory
```
`rmdir` コマンドはディレクトリの内部にコンテンツがない場合にディレクトリを削除します。

![1_aUJ0VbrVb_cTUf0okMxmWA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/92238e99-0efa-67b2-36b8-7b72408b273b.png)
<DIV ALIGN=CENTER>`rmdir` でからのディレクトリを削除</DIV>

# 8. tail
```Bash
$ tail somefile
```
`tail` コマンドはファイルの最後の部分（テール）を読み取り出力します。
![1_Xvo2zdyDZqj4QhTHF0TLTg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/99f8d160-27e9-3f15-4174-e4ac2d24029f.png)
<div align=center>デフォルト（10）の代わりに最後のnum 行を出力</div>
<br>
`tail` コマンドは、クラッシュレポートや直近の履歴ログを調べるときに便利です。ファイルログを確認するときに有用となる例を以下に記載します。

```Bash
# tail /var/log/messages
Mar 20 12:42:22 hameda1d1c dhclient[4334]: DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x280436dd)
Mar 20 12:42:24 hameda1d1c avahi-daemon[2027]: Registering new address record for fe80::4639:c4ff:fe53:4908 on eth0.*.
Mar 20 12:42:28 hameda1d1c dhclient[4334]: DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x280436dd)
Mar 20 12:42:28 hameda1d1c dhclient[4334]: DHCPACK from 10.76.198.1 (xid=0x280436dd)
Mar 20 12:42:30 hameda1d1c avahi-daemon[2027]: Joining mDNS multicast group on interface eth0.IPv4 with address 10.76.199.87.
Mar 20 12:42:30 hameda1d1c avahi-daemon[2027]: New relevant interface eth0.IPv4 for mDNS.
Mar 20 12:42:30 hameda1d1c avahi-daemon[2027]: Registering new address record for 10.76.199.87 on eth0.IPv4.
Mar 20 12:42:30 hameda1d1c NET[4385]: /sbin/dhclient-script : updated /etc/resolv.conf
Mar 20 12:42:30 hameda1d1c dhclient[4334]: bound to 10.76.199.87 -- renewal in 74685 seconds.
Mar 20 12:45:39 hameda1d1c kernel: usb 3-7: USB disconnect, device number 2
```

# 9. wget
```Bash
$ wget someurl
```
`wget` (GNU Wget)は 最も広く使用されているインターネットプロトコルであるHTTP、HTTPS、FTP、およびFTPSを使用してファイルを取得するための、フリーソフトウェアパッケージです。ノンインタラクティブなコマンドラインツールであるため、スクリプト、CRONジョブ、X-Windowsサポートのないターミナルなどから簡単に呼び出すことができます。

![1_nbzEhCeVUxT2-Px0oQbszQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/f09628e4-71c5-705d-a561-36cebd92abc7.png)
<div align=center>`wget` でウェブページの情報を取得</div>
<br>
`wget` (GNU Wget)には、大きなファイルの取得やWebサイト、FTPサイト全体のミラーリングを容易にする以下のような多くの機能があります。

- RESTとRANGEを使用して、中断したダウンロードを再開できます
- ファイル名にワイルドカードを使用して、ディレクトリを再帰的にミラーリングできます
- NLSベースの様々な言語向けメッセージファイル
- オプションでダウンロードされたドキュメントの絶対リンクを相対に変換し、ダウンロードされたドキュメントがローカルで相互にリンクできるようにします
- ほとんどのUNIXライクなオペレーティングシステムおよびMicrosoft Windowsで実行可能
- HTTPプロキシをサポート
- HTTP Cookieをサポート
- 持続的なHTTP接続をサポート
- コンソール無接続 / バックグラウンド  でのダウンロードをサポート
- ローカルファイルのタイムスタンプを使用して、ミラーリング時にドキュメントを再ダウンロードする必要があるかどうかを判断
- GNU WgetはGNU General Public Licenseのもとで配布されています。

詳細については、[公式のGNUドキュメント](https://www.gnu.org/software/wget/)を参照してください。

# 10. find
```Bash
$ find path -name filename
```
`find` コマンドによりファイルまたはディレクトリをすばやく検索できます。数百以上のファイルや複数のディレクトリを持つ、大きなプロジェクトで作業する場合に便利です。
![1_j291SZcYXSaPtdvqipX6sg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/e2115159-d2b4-0711-3f49-4fbc02176164.png)
<div align=center>`find` でディレクトリ内の`index.js`という名前のファイルすべてを見つける</div>

### 特定の種類のファイルを検索する

`find` コマンドを使用すると、ディレクトリ（およびそのサブディレクトリ）内で同じタイプのファイルを検索することもできます。例えば以下のコマンドは現在の作業ディレクトリ内のすべての .js ファイルを検索します。

```Bash
$ find . -name "*.js"
```
![1__i8_TEIElXAAyXy-F1JQmA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/e5c750f7-034c-4269-79a8-9d80802426ac.png)
<div align=center>`components`ディレクトリですべての .js ファイルを見つける</div>

# 11. mv
```Bash
$ mv somefile /to/some/other/path
```
`mv` コマンドは、ファイルまたはディレクトリをある場所から別の場所に移動します。この`mv` コマンドは、単一ファイル、複数ファイル、およびディレクトリの移動をサポートしています。

![1_TdqoyPUFrdBvI2Ws7cfyfQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/3eb160d8-16a7-6fa2-5099-70100ae0e5ae.png)
<div align=center>some-directory を components からutils に移動する</div>

# 最後に..
ここまで読んでいただきありがとうございます。何か得るものがあったなら幸いです。もっと便利なコマンドを知っている場合は是非共有していただき、一緒に成長していきましょう。

<div align=center>-貪欲であれ。好奇心旺盛であれ。-</div>

# 翻訳協力
　
Original Author:  **[Indrek Lasn](https://medium.com/@indreklasn)** 
Thank you for letting us share your knowledge! 

この記事は以下の方々のご協力により公開する事が出来ました。
改めて感謝致します。
選定担当: Yumika Tomita
翻訳担当: @upaldus
監査担当: @nyorochan
公開担当: @miyonori0812

# ご意見・ご感想をお待ちしております
今回の記事は、いかがだったでしょうか？
・こうしたら良かった、もっとこうして欲しい、こうした方が良いのではないか
・こういったところが良かった
などなど、率直なご意見を募集しております。
いただいたお声は、今後の記事の質向上に役立たせていただきますので、お気軽にコメント欄にてご投稿ください。
みなさまのメッセージをお待ちしております。