LAMP環境でよく使う初心者向けコマンド集

最初のよくわからない時期よく使ったなぁと思うコマンドをまとめたもの
前提はMac,Linux(CentOS7)

# Linux編（というかUNIX系?）

## ディレクトリを移動する(cd)

Windowsならエクスプローラーあるし、Macならファインダーがあるけど、
CUIに慣れる意味で、ファイルを探す際もCUIで行うといい。
慣れるとこっちの方が早いし楽。

```shell
# 文法
cd 移動先ディレクトリ

# 一個下のsubディレクトリに潜る
cd ./sub

# 一個上のディレクトリに戻る
cd ../

# 繋げて書けばどこまででも潜れる
cd ./sub/sub2/sub3
```

## ディレクトリ内のファイル・ディレクトリを確認する(ls)

`cd`で移動したはいいけど、今自分はどこにいて、ここには何があるのか？
現状把握は重要だ。何事においても。

```shell
# 文法も何も...これだけ
ls

# -lを使うとちょっと見やすくなる
ls -l

# -alとすると隠しファイルも見える
ls -al

# カレントだけでなく、パスさえ指定すれば他のディレクトリも見られる
ls -al ./sub
```

## ファイルを編集する(vi)

サーバーのファイルを編集したいんだけど、ローカルのファイルと違って、
どう編集すればいいのかわからない！初心者あるある。
そういう時は`vi`を使う。指定したファイルが存在しない場合は、新規作成になる。
開いたら上書きしたり、閉じたりの操作が必要になるけどそれは`vi`で調べるの推奨。

```shell
# 文法
vi 編集したいファイル

# hoge.txtを開く例、ない場合はhoge.txtができる
vi hoge.txt
```

## ファイルを閲覧する(less)

`vi`でもファイル開けるし、見られるんだけど、本来の用途は編集だし、
間違って編集してしまっても怖い。なので閲覧には見るだけのコマンドを使う

```shell
# 文法
less 閲覧したいファイル

# hoge.txtを開く例
less hoge.txt

# +Fオプションをつけると、hoge.txtを開いてる途中で編集された内容も閲覧できる
less +F hoge.txt
```

## ファイルをコピーする(cp)

ファイルを編集したいけど、元のファイルもバックアップとして残しておこう。
そんな時によく使う。
別名としてコピーしたり、そのままの名前で違うディレクトリにコピーしたり、
あるいは同じ拡張子のファイルをまとめて違うディレクトリにコピーしたり、
コピーだけでも色々できる。

```shell
# 文法
cp ファイル名

# hoge.txtをカレントにhoge.txt.orgとしてコピーする
cp hoge.txt hoge.txt.org

# カレントにsubディレクトリを作って、subディレクトリ内にhoge.txtをコピー
mkdir sub
cp hoge.txt ./sub

# カレントのtxt拡張子のファイルを全てsubディレクトリ内にコピー
cp *.txt ./sub

# ディレクトリ丸ごとコピー、中に入ってるファイルもコピーする
cp -R ./sub ./sub2
```

## ファイルを移動・リネームする(mv)

移動とリネームは同じコマンド。
コピーと違って、元のファイルはなくなり、場所が変わったり、名前が変わったりする。
破壊的なコマンドなので、cpよりも注意が必要

```shell
# 文法
mv 変更前のファイル名 変更後のファイル名

# hoge.txtをfuga.txtにリネームする場合
mv hoge.txt fuga.txt

# hoge.txtをsubディレクトリに移動する場合
mv hoge.txt ./sub/hoge.txt

# まとめて移動もできる
mv *.txt ./sub
```

## ファイルを削除する(rm)

一時的に使ったファイルは片付ける。
それがマナー。サーバーに不要なファイルをそのままにしておいてはいけない。
そんな時は削除コマンド。
キャッシュの削除なんかにもよく使う。
しかし、mvなんかと違って、打ったら跡形もなく消えてしまうので、さらに注意が必要
ファイルだけではなく、ディレクトリももちろん削除できる

```shell
# 文法
rm ファイル名

# hoge.txtを削除する
rm hoge.txt

# subディレクトリを削除する
rm -r ./sub
```

## ファイルを新規作成する(touch)

`vi`でもできるけど空のファイルを作りたいだけなのに一々編集が開くのは面倒。
というわけで、新規にファイルを作りたいだけなら`touch`を使う。

```shell
# 文法
touch ファイル名

# hoge.txtを新規作成する、既にファイルがある場合は作成されず、元のファイルがそのまま
touch hoge.txt
```

## ファイルの権限を変更する(chmod)

たまに出るPermission Denied系のエラーの時とかに使ってる
tmp以下のlogファイルに書き込もうとしてるけど権限ないから書き込めないよ！
とかがよくある。具体的な権限については割愛

```shell
# 文法
chmod 権限 ファイル名

# hoge.txtの権限を変更する
chmod 755 hoge.txt

# subディレクトリ内の全てのディレクトリ、ファイルの権限を変更する
chmod -R 755 ./sub
```

## ファイルの所有者・グループを変更する(chown)

ファイル・ディレクトリの所有者を変更したい時に使う。
ファイルの出力先の所有者をapacheに変更したりとか。

```shell
# 文法
chown 所有者 ファイルorディレクトリ名
chown 所有者:グループ名 ファイルorディレクトリ名

# hoge.txtの所有者をapacheに変更する
chown apache hoge.txt

# hoge.txtの所有者をapache、グループをapacheに変更する
chown apache:apache hoge.txt

# subディレクトリ以下のファイルやディレクトリの所有者をapache、グループをapacheに変更する
chown -R apache:apache ./sub
```

## ファイルを検索する(find)

あのファイル探してるんだけどどこにあるのかわからない。
よしコマンド打って探してみよう。

```shell
# 文法
find 検索したいディレクトリ -name ファイル名

# subディレクトリ以下のディレクトリからhoge.txtを検索する
find ./sub -name hoge.txt

# カレントディレクトリ以下からcsv拡張子のファイルを検索する
find . -name *.csv

# 更新日からファイルを見つける
## 更新日が10日以内
find . -mtime -10
## 10以上前
find . -mtime +10
## ちょうど10日前
find . -mtime 10
```

## 絞り込みをしたい(grep)

コマンドの実行結果を絞り込みしたい時に使えるコマンド。
皆大好き`grep`

```shell
# 文法
コマンド | grep 絞り込みワード

# ls結果を201809というワードで絞り込み
ls -al | grep 201809
```

## 過去に打ったコマンドを見たい(history)

過去にこだわらない男はかっこいいが、ちょっとは気にした方が少し陰があってかっこいい。
そう思わないですか？

```shell
# 文法も何もこれだけ
history

# grepと一緒に使えば、指定のワードだけ入った履歴を抜き出せたりもする。
history | grep mysql
```

## サーバーに入る(ssh)

基本のき。サーバー入ってごにょごにょは毎日のようにする。
test_userの部分はサーバーに入るユーザー
@以降はホスト名と呼ばれる部分で、サーバーのIPアドレスもしくはドメイン
-i ではサーバーに設定されている公開鍵に対応する秘密鍵
-p ではポート番号を指定

```shell
# 文法
ssh ユーザー名@ホスト名 オプション

# 実例
ssh test_user@192.168.33.5

# 秘密鍵を指定する場合
ssh test_user@192.168.33.5 -i example.key

# 名前解決できればもちろん下記でもいける
ssh test_user@example.com -i example.key

# SSHのポートを22から変更している場合は
ssh test_user@example.com -i example.key -p 2222
```

ただこれを毎回指定するのは怠いので、設定ファイルに書くと良い

```shell
# .ssh/configを開く
sudo vi ~/.ssh/config
```

``` plain:.ssh/config
Host example.com
    HostName 192.168.33.5
    User test_user
    Port 2222
    IdentityFile /.ssh/example.key(鍵が置いてあるPath)
```

```shell
# これだけでSSH接続できる
ssh example.com
```

## サーバーにファイルをあげる、あるいは落としてくる(scp)

サーバーになんかあげたり、落としてくる操作は割とやるので、覚えておくと便利。
ちなみに.ssh/configに設定を書いておくと、Hostを指定するだけでscpできる。
-P はポート番号
-i は秘密鍵
サーバー側に繋ぐ場合は、ssh同様、ユーザー名@ホスト名
サーバー側ディレクトリの指定は、`ホスト名:`以降にパスを書く

```shell
# 文法
scp ファイルパス ファイルのコピー先

# ローカルのカレントにあるhoge.txtをサーバーの/tmpにあげる例
scp -P 2222 -i example.key ./hoge.txt test_user@192.168.33.5:/tmp

# あるいはローカルのカレントにサーバー側の/tmp/hoge.txtを落とす例
scp -P 2222 test_user@192.168.33.5:/tmp/hoge.txt ./

# .ssh/configを設定していればこうもかける
scp ./hoge.txt example.com:/tmp
scp example.com:/tmp/hoge.txt ./
```

# Apache編

詳しくないし特にない。

# MySQL編

SQL文というより、ローカルからリモートに接続したり、
mysqlで入らなくてもMySQLを操作したり、ddl流したりという所が主題。
-uと-pの後はスペース空けないとこがポイント。

## MySQLにログイン

一応念の為これぐらいは。

```shell
# 文法
mysql -u ユーザー名 -p DB名 -h ホスト名

# mysqlにtest_userでパスワード有りで、ログインしますよの例
mysql -u test_user -p

# ちなみにこうするとpasswordを聞かれずにログインできるが、コマンド履歴に残る
mysql -utest_user -ppassword

# ローカルからリモートのmysqlに接続する場合
mysql -utest_user -ppassword testdb -h 192.168.33.5

# あるいはホスト名でも可能
mysql -utest_user -ppassword testdb -h example.com
```

## SQLを直接流す

毎回毎回`mysql -u user -p`でログインするのも結構面倒。
なので直接実行できると便利だなぁ。できます。

```shell
# testdbにusersテーブルがある場合、下記のように直接SQLを実行可能
mysql -utest_user -ppassword testdb -h example.com -e 'SELECT * FROM users'

# SQLファイルを流すこともできる
mysql -utest_user -ppassword testdb -h example.com < insert_users.sql
```

## バックアップを取る(mysqldump)

作業前にバックアップは取っとこうの巻き。
既存のレコードに変更を加えるのはほんと怖い。

```shell
# testdbを丸ごとバックアップ
mysqldump -utest_user -ppassword testdb > dump_testdb.sql

# testdbのusersテーブルをバックアップ
mysqldump -utest_user -ppassword testdb users > dump_testdb_users.sql

# testdbのusersテーブルのレコードのみをバックアップ
mysqldump -t -utest_user -ppassword testdb users > dump_testdb_users_records.sql
```

# PHP編

面倒なのでまとめる

```shell
# バージョン確認
php -v

# PHPのモジュール確認
php -m

# grepすると目的のものが入ってるかわかりやすい
php -m | grep intl

# コマンドラインからPHPの実行
php -r 'echo "Hello World!";'

# PHPを対話式で実行する。あとはecho 'Hello World';とか打ったら実行される
# ctrl + c か exitとコマンドすると抜けられる
php -a

# phpinfo()とかするのが面倒なので、代わりに使ったり？
php -i

# php -mと同様にgrepすると便利
php -i | grep php
```

# その他

追加したくなったら更新予定。
ApacheだとVirtualHostとかhttpd.confとか.htaccessとか周りが、
初心者的に躓きの連続だったので、そのうちちゃんとまとめたい。

間違ってたり、他にもこういういいのあるよーとかあれば教えていただければ幸いです。