仕事が遅い人は絶対に知らないワンライナー10選

この記事は[身の回りの困りごとを楽しく解決！ by Works Human Intelligence Advent Calendar 2022](https://qiita.com/advent-calendar/2022/works-hi-1)の13日目の記事です。
この記事では皆さまに「遊び心」と「楽しさ」をお届けできればと思います :satisfied:

## はじめに

黒い画面に**ﾀｶﾀｶｯ!ﾀｰﾝ!** っと打つとすべての仕事が完了した雰囲気を出すスーパーエンジニア、あなたの会社にも一人は居るのではないでしょうか。この記事では「仕事が早い人」なら誰でもやっている作業効率爆上げコマンドを10選ご紹介します。
実用性が高い・遊び心満載のワンライナー、ぜひお楽しみください！ (ﾀｶﾀｶｯ!ﾀｰﾝ!)

## 目次

[1. カレントディレクトリのファイルをチラ見する「look」コマンド](#カレントディレクトリのファイルをチラ見するlookコマンド)
[2. iOSシミュレータをサクッと起動する「ios」コマンド](#iosシミュレータをサクッと起動するiosコマンド)
[3. 今日変更があったファイルのみを出力する「lt」コマンド](#今日変更があったファイルのみを出力するltコマンド)
[4. Github上のPRのブランチにcheckoutする「prr」コマンド](#github上のprのブランチにcheckoutするprrコマンド)
[5. もうyarnコマンド覚える必要なし！定義されているscriptsを自動で抜き出して実行する「yy」コマンド](#もうyarnコマンド覚える必要なし定義されているscriptsを自動で抜き出して実行するyyコマンド)
[6. dockを一瞬で非表示にする「dock」コマンド](#dockを一瞬で非表示にするdockコマンド)
[7. デスクトップアイコンを一瞬で非表示にする「dt」コマンド](#デスクトップアイコンを一瞬で非表示にするdtコマンド)
[8. Finderで開いているディレクトリにTerminal上で移動する「cdf」コマンド](#finderで開いているディレクトリにterminal上で移動するcdfコマンド)
[9. Terminal上で今いるディレクトリをFinderで開く「oo」コマンド](#カレントディレクトリをfinderで開くooコマンド)
[10. IPアドレスを一撃で取得する「myip」](#ipアドレスを一撃で取得するmyip)
[11. おまけ：今日の天気が気になるなら「tenki」コマンド](#おまけ今日の天気が気になるならtenkiコマンド)


## カレントディレクトリのファイルをチラ見する「look」コマンド

カレントディレクトリにある`README.md`とか`package.json`など中身を軽く確認したいことってありますよね。ファイルを開かずチラ見したいときのコマンドがこちら。
あいまい検索でファイルをフィルタリングし、選択するとエディタで開きます。

![lk.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/1feb6c31-79ce-c8ab-d896-e1606a5ebfe7.gif)

<details><summary>コードを表示</summary>

```sh
# カレントディレクトリ以下をプレビューし選択して開く
alias lk='_look'
_look() {
  if [ "$1" = "-a" ]; then
    local find_result=$(find . -type f -o -type l)
  else
    local find_result=$(find . -maxdepth 1 -type f -o -type l)
  fi
  local target_files=($(echo "$find_result" \
    | sed 's/\.\///g' \
    | grep -v -e '.jpg' -e '.gif' -e '.png' -e '.jpeg' \
    | sort -r \
    | fzf-tmux -p80% --select-1 --prompt 'vim ' --preview 'bat --color always {}' --preview-window=right:70%
  ))
  [ "$target_files" = "" ] && return
  vim -p ${target_files[@]}
}
```
</details>

VimじゃなくてVSCodeで開きたい方は最後の行を下記のように変更してください。
```diff
 ...略
  [ "$target_files" = "" ] && return
-  vim -p ${target_files[@]}
+  /Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code ${target_files[@]}
```

`code`というaliasを作っておくと`code ~/Desktop/hoge`な感じでVSCodeで開けるようになるのでおすすめです。
```sh
# VSCodeでファイル・ディレクトリを開く
alias code="/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code"
```

## iOSシミュレータをサクッと起動する「ios」コマンド

フロントエンドの動作確認時、safariでの細かい挙動はChromeDevToolsで確認できないので、iOSシミュレータを使うことあると思います。
iPhoneとiPadで確認したいときなど、複数のシミュレータを一撃で起動できます。

![ios_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/164d8255-7748-4932-3ba9-83ea954b3fa9.gif)


<details><summary>コードを表示</summary>

```sh
# iOSシミュレータを起動
alias ios='_open_ios_simulator'
_open_ios_simulator() {
  local identifier=$(xcrun simctl list runtimes -j | jq -r '.runtimes[] | select(.platform == "iOS") | .identifier')
  local devices=$(xcrun simctl list devices -j | jq -r ".devices[\"${identifier}\"][] | select(.isAvailable == true) | .name" | fzf)
  [ -z "$devices" ] && return
  echo "$devices" | while read device; do
    xcrun simctl boot "$device"
    open -a Simulator
  done
}
```

もし下記のようなエラーが出てしまったら、
```sh
xcrun: error: unable to find utility "simctl", not a developer tool or in PATH
```
`Xcode > Preferences > Locations`で「Command Line Tools」をセットすればOKです。

![xcode_preference_locations.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/8fe29ac8-2776-30fb-a7d9-d4364ce7b486.png)

</details>

## 今日変更があったファイルのみを出力する「lt」コマンド

エラーログが1つのディレクトリにまとめて置かれ、エラーがあった際は複数のログファイルに書き込まれる。ああ、エラー出力されたログファイルだけ抜き出したい。そんな状況で活躍するのがこのコマンドです。
カレントディレクトリで「今日変更があったファイルのみ」を`ls`します。

![lt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/b308e33a-ede4-22e3-f21e-890e3cd52137.gif)
（GIFでは`touch`コマンドで「今日変更があった」を再現しています。）

▼コード
```sh
# 本日変更があったファイルのみをls
alias lt='_ls_today'
function _ls_today() {
  gls --full-time --time-style="+%Y-%m-%d %H:%M:%S" $1 | grep $(date "+%F")
}
```

`gls`はGNU版の`ls`です。`brew install coreutils`で使えるようになります。
Macの最初から入っている`ls`だと`--full-time`、`--time-style`オプションが存在しないのでGNU版の`ls`を使っています。

## Github上のPRのブランチにcheckoutする「prr」コマンド

PRレビューで手元で動作確認する際に「ブランチをローカルに落としてきて、ブランチ名確認して、チェックアウトして...」という作業から開放されます。
Githubに上がっているPRをリスト化し、選択するとそのブランチに切り替えます。  

![prr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/9fd62806-79c6-9182-ce81-4fc10b47887d.gif)
（GIFでは説明のためにブラウザでGithubを開いていますが、実際は開く必要はありません）

<details><summary>コードを表示</summary>

```sh
# PRのブランチへチェックアウト
alias prr='_git_checkout_from_pr'
_git_checkout_from_pr() {
  local pr=$(gh pr list --search "NOT bump in:title" | fzf | awk '{print $1}')
  [ -z "$pr" ] && return
  gh pr checkout $pr
}
```
</details>


[gh](https://github.com/cli/cli)はGithub公式のコマンドです。`brew install gh`でインストールできます。

## もうyarnコマンド覚える必要なし！定義されているscriptsを自動で抜き出して実行する「yy」コマンド

`yarn dev`, `yarn build`, `yarn storyboard`, etc...一体いくつ定義されているんでしょう。しかも各リポジトリごとに微妙に違うのでいやーんなっちゃう...  
`yy`さえ覚えておけばもう大丈夫。
リポジトリ内の`package.json` に定義されているscriptsコマンドを抽出してfzfで選択し実行できます。

![yy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/ffc8d3d5-1181-04f0-8ad3-93a055968a5f.gif)

<details><summary>コードを表示</summary>

```sh
# fzfでyarn。カレントディレクトリにpackege.jsonがある場合はそれを利用。なければgit管理化のrootにあるpackage.jsonを利用
alias yy='_fzf_yarn'
_fzf_yarn() {
  local packageJson=$(find ./ -maxdepth 1  -name 'package.json')
  if [ -z "$packageJson" ]; then
    local gitRoot=$(git rev-parse --show-cdup)
    packageJson=$(find ${gitRoot}. -maxdepth 2  -name 'package.json')
  fi
  [ -z "$packageJson" ] && return
  local actions=($(cat ${packageJson} | jq -r '.scripts | keys | .[]' \
    | fzf-tmux -p --preview "cat ${packageJson} | jq -r '.scripts[\"{}\"]'" --preview-window=up:1))
  [ -z "$actions" ] && return
  local cmd=''
  for action in "${actions[@]}"; do
    if [ -z "$cmd" ]; then
      cmd="yarn $action"
    else
      cmd="$cmd && yarn $action"
    fi
  done
  printf "\e[35m$cmd\n\e[m\n"
  print -s "$cmd"
  eval "$cmd"
}
```
</details>

こだわりポイントは`print -s "$cmd"`でzshのコマンド履歴に残しているところですね。これをすることで次同じyarnコマンドを実行する際はもう一度`yy`を打って選択するのではなく、`ctrl-p`で実行できます。毎回fzfで選択するのはバッドオシャンティです。

## dockを一瞬で非表示にする「dock」コマンド

普段dockは常に表示しているけれど、もっと大画面でMacを感じたい。そう思ったことありませんか。
このコマンドは「ｄｏｋｋｕ」と口に出しながら実行すると気持ちいいです。

![dock.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/5b5626d0-ed29-6a62-3dbb-428fb2ef5e8d.gif)


<details><summary>コードを表示</summary>

```sh
# dockの表示/非表示を切り替える
alias dock='_toggle_dock'
_toggle_dock() {
  osascript <<EOS
  tell application "System Events"
    tell dock preferences to set autohide to not autohide
  end tell
EOS
}
```
</details>

次に紹介する`dt`コマンドと合わせるとデスクトップにさらに大画面を感じることができます。

## デスクトップアイコンを一瞬で非表示にする「dt」コマンド

あ、やばい！ 同僚が急に画面を覗き込んできた！！ っていうときに使えます。仕事ができる人の机はきれいです。GIF動画を撮るときなどにも使えますね。

![dt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/ab961573-e91c-df3d-4498-2fe46cb795b5.gif)


<details><summary>コードを表示</summary>

```sh
# デスクトップ上アイコンの表示/非表示を切り替える
alias dt='_toggle_desktop_icon_display'
_toggle_desktop_icon_display() {
  local isDisplay=$(defaults read com.apple.finder CreateDesktop)
  if [ $isDisplay -eq 1 ]; then
    defaults write com.apple.finder CreateDesktop -boolean false && killall Finder
  else
    defaults write com.apple.finder CreateDesktop -boolean true && killall Finder
  fi
}
```
</details>

あくまで非表示にしているだけで削除はされないので安心して実行してください。

## Finderで開いているディレクトリにTerminal上で移動する「cdf」コマンド

コマンドが大好きな私ですが、ときにはGUIでディレクトリ移動したほうが早いときもあります。このコマンドはディレクトリ移動はFinderでやり、その後の処理はターミナルでやりたいといった場面で使えます。

![cdf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/1fb672c1-b78e-6dd3-0ba9-57e0a4b51b01.gif)

<details><summary>コードを表示</summary>

```sh
# Finderで開いているディレクトリにTerminalで移動する
alias cdf='_cd_opend_finder'
_cd_opend_finder() {
  cd "$(osascript -e 'tell app "Finder" to POSIX path of (insertion location as alias)')";
}
```
</details>

Finderからターミナルへドラッグ・アンド・ドロップでよくね？と思ったあなた。それはコマンド好きには受け入れられない動作です。

## カレントディレクトリをFinderで開く「oo」コマンド

これは先程の`cdf`コマンドと逆の動きをするものです。Terminalで今いる場所を、Finderで開きます。

![oo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/c9b00702-638c-1b39-5505-27c52b6a8b71.gif)

▼ コード
```sh
alias oo='open .'
```
ほんのちょっとのaliasですが、めちゃくちゃ楽になります。いやほんとに。

## IPアドレスを一撃で取得する「myip」

「IP許可お願いします〜」。この言葉人生であと何回言うんでしょうね。もう100万回は言ってると思いますがこれからも言い続けるでしょう。少しでも負担を減らしたいです。

▼ コード
```sh
# グローバルIPを確認
alias myip='curl ifconfig.io -4'
```

```sh
$ myip
103.5.140.160
```
これからは`myip | pbcopy`でコピペして送りましょう！

## おまけ：今日の天気が気になるなら「tenki」コマンド

天気でその日の生産性は決まります。
私は晴れてると銭湯に行ってしまうので、雨の日のほうが生産性は高いです。

![tenki.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142791/ff3e3552-d4a0-5271-9cdf-643927b07e50.gif)

```sh
# お天気情報を出力する
alias tenki='curl -4 http://wttr.in/kanagawa'
```
`kanagawa`の部分を`tokyo`や`aichi`などにすれば各県のお天気情報が表示されます。


## 終わりに

普段のちょっとした作業を効率化するワンライナーを紹介しました。（もはやワンライナーではなくシェルスクリプトでしたが）  
面倒だなーと思う「退屈」な作業もコマンドで楽にできないかを考えると「楽しい」学びに変わります。こういった小さな楽しさを普段の業務中でも見つけられたら最高ですよね^^  

ちなみにシェルスクリプトでさらなる作業効率化したい方、こちらの記事もどうぞ！

https://www.rasukarusan.com/entry/2019/12/20/000000


今日紹介したコマンドが明日の楽しさに繋がれば嬉しいです！ それではまた！ (ﾀｶﾀｶｯ!ﾀｰﾝ!)