私的コマンドチートシート


<!--
Copyright (c) 2025 Takaya Maekawa
This file is distributed under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
See the LICENSE file in the source directory for details.
(https://creativecommons.org/licenses/by-nc-sa/4.0/)
-->

# コマンドチートシート

## 権限
### 再帰的にリセット
以下は、カウントディレクトリ以下で、`.git`と`vendor`ディレクトリを除いたファイルやディレクトリに対して、権限をリセットするコマンド
```bash
find . -type f \( ! -path "./.git/*" ! -path "./vendor/*" \) -exec chmod 644 {} +
find . -type d \( ! -path "./.git/*" ! -path "./vendor/*" \) -exec chmod 755 {} +
```
ただ、こういうfind関数を使う場合には、それの及ぼす範囲を先に見ておきたいものだ。  
以下のコマンドで、対象のファイルが出力される。
```bash
find . -type f \( ! -path "./.git/*" ! -path "./vendor/*" \) -exec ls -l {} +
```

## シンボリックリンクを通す
```bash
sudo ln -s /path/to/target /path/to/wanna/to/place
```

## 特定の階層以下のファイルのパスと内容を表示
```bash
find path/to/directory/ -type f -exec sh -c 'echo "==== {} ===="; cat {}' \;
```

## curl
### 静的ファイルからヘッダ情報取得
```bash
curl -I https://example.com/path/to/sample.txt
```

## find
### 再帰的にfindでディレクトリに対してchmod 755
```bash
sudo find /mc -type d -exec chmod 755 {} \;
```
### すべてのファイルをチェック
```bash
find /path/to/directory -type f -exec file -i {} \;
```
### 階層1
```bash
find /path/to/directory -maxdepth 1 -type f -exec file -i {} \;
```
### その階層のすべてのファイルに対し、実行
(ここでは、cpコマンドでbackupディレクトリへ)
```bash
find . -maxdepth 1 -type f -exec cp {} ./backup \;
```

## ファイルの文字コードを出力
```bash
file -i /path/to/file
```

## zip
```bash
zip -r FILENAME.zip FILE_DIR
```
https://qiita.com/seyself/items/ae47f1c22a7375a736f3

除外
```bash
zip -r sample.zip sample/ -x "sample/libraries/*" "sample/log/*"
```

## 一個前のコマンドを出力
```bash
history | tail -n 1
# or
fc -ln -1
```

## 一個前のコマンドを再実行
```bash
!!
```

## acl
`mc`ユーザーに対して、`/mc/server`フォルダおよびそのサブディレクトリとファイルに対する全アクセス権限を再帰的に付与する。
```bash
sudo setfacl -R -m u:mc:rwx /mc/server
```
`mc`ユーザーに対するデフォルトACLを設定し、将来的に新しく作成されるファイルやディレクトリにも同じ権限が適用されるようにする。
```bash
sudo setfacl -dR -m u:mc:rwx /mc/server
```

## tail
```bash
sudo tail -f /var/log/nginx/access.log
```

## tree
```bash
tree -I "*.html|*.png|*.jpg"

tree -I venv/
tree -I node_modules/
```

## github
### 特定のコミットを削除するには
```bash
git reset --hard HEAD~1
```
```bash
git revert <commit-id>
```
```bash
git rebase --continue
```
### リモートURLをSSHに変更
まず、鍵を生成し、それをデプロイ
```bash
git config --global user.name ""
git config --global user.email ""
ssh -T git@github.com
git remote set-url origin git@github.com:<user>/<repo>.git
```

### リモートURLをHTTPSに変更
```bash
git remote set-url origin https://github.com/<user>/<repo>.git
```
### 特定のブランチ名を指定してクローン
```bash
git clone -b <branch-name> <clone-url>
```
### access-tokenをローカルに設定
リポジトリの`HTTPS URL`にアクセストークンを埋め込む。
元の`HTTPS URL`が`https://github.com/username/repository.git`の場合、以下の形式に変更する。  
`https://your_access_token@github.com/username/repository.git`  
`your_access_token`は、生成したアクセストークンに置き換えよう。

最後に、リモートURLを変更
```bash
git remote set-url origin https://your_access_token@github.com/username/repository.git
```

### タグを作ってプッシュ
```bash
git tag -a v1.0 -m 'version 1.0'
git push origin v1.0
```
リモートで使ったタグを削除するとき、ローカルには残っているため、それを削除する
```
git tag -d <tag-name>
```

### 新規リモートに対して、特定ブランチへのプッシュまで
```bash
git remote add origin https://github.com/<user>/<repo>.git

git status
git add .
git commit -m "first commit"
git checkout -b scala
```

### 新規リモートをWEBで作った後、プッシュまで
```bash
git init
echo "# updater" >> README.md
git add README.md
git commit -m "first commit"
git branch -M master
git remote add origin https://github.com/<user>/<repo>.git
git push -u origin master
```
### remote-urlを確認するには
```bash
git remote -v
```
### git configのリセット
```bash
git config --global --unset credential.helper
git config --global --unset credential.credentialStore
```
### submoduleを一括インポートする
```bash
git submodule update --init --recursive
```
### リモートブランチ名をリネームしたときにローカルでやること
例えば、`sample`ブランチを`master`ブランチに変更したとする。
#### ローカルの`sample`ブランチを`master`にリネームする
```bash
git branch -m sample master
```
#### リモート追跡ブランチを更新する
```bash
git remote set-head origin -a
```
#### 追跡ブランチを設定する
```bash
git branch --set-upstream-to=origin/master master
```
#### ブランチを切り替える
##### 現在どのブランチにいるかを確認
```bash
git status
```
##### ローカルでmasterブランチのものをdevブランチに変更してプッシュする
ローカルにdevブランチを作成し、masterブランチの内容を引き継ぎ、そのブランチに切り替えることができる。
```bash
git checkout -b dev master
```
これを実行した後は、以下を実行し、devの左に`*`がついていることを確認しよう。
```bash
git branch
```
初めてプッシュする場合は、以下を実行しよう。
```bash
git push -u origin dev
```
#### レポジトリ名を変更時にローカルですること
##### リモートレポジトリURLを新しいものにする
```bash
git remote set-url origin <new-repo-url>
```
#### リモートを追加
```bash
git remote add origin https://github.com/<user>/<repo>.git
```
#### gitmodule
##### 追加
パス`sub`に対し、サブモジュールをインポートする例
```bash
git submodule https://github.com/<user>/<repo>.git ./sub
```
##### シンプルなインポート
`.gitmodules`に記述されているものだけをインポート。その中にサブモジュールがあっても、インポートしない。
```bash
git submodule init
```
##### 再帰的にインポート
```bash
git submodule update --init --recursive
```