世界を動かす技術を、日本語で。

私が常に使っているスクリプト

概要

  • dotfiles管理歴10年以上の筆者による 便利なシェルスクリプト集 の紹介
  • クリップボード操作、ファイル管理、インターネット関連など多岐にわたる用途
  • テキスト処理 やプロセス管理、システム操作まで幅広く対応
  • 各スクリプトの 使い方や活用例 を具体的に解説
  • 日常的に役立つ 実用的な小技 が満載

私のお気に入りシェルスクリプト集

クリップボード操作

  • copypasta :システムのクリップボードマネージャー(macOSのpbcopyやLinuxのxclip)用ラッパー
    • パイプでデータをコピー、クリップボード内容をファイル出力
    • 例:run_some_command | copypasta > file.txt
  • pastas :クリップボードの内容を監視・出力
    • クリップボードが変化するたびに新しい内容を標準出力
    • 例:pastas > everything_i_copied.txt
  • cpwd :現在のディレクトリパスをクリップボードにコピー
    • 複数タブ間でディレクトリ移動時に便利

ファイル管理

  • mkcd foo :ディレクトリ作成後、即移動
  • tempe :一時ディレクトリへ移動し作業。不要なファイルの自動整理に便利
  • trash :ファイルをゴミ箱へ移動(rmより安全、macOS/Linux対応)
  • mksh :実行権限付きのシェルスクリプトを素早く作成・編集

インターネット関連

  • serveit :カレントディレクトリで静的ファイルサーバー起動(Python無くても代替可)
  • getsong / getpod :yt-dlpで音楽やポッドキャスト音声を高音質でダウンロード
  • getsubs :動画の英語字幕をダウンロード(公式が無ければ自動生成にフォールバック)
  • wifi on/off/toggle :Wi-Fiのオンオフ切替
  • url :URLを各要素(プロトコル、ホスト名、パス、クエリ、ハッシュ等)に分解

テキスト処理

  • line 10 :標準入力から10行目だけ表示
  • scratch :一時ファイルをエディタで開く
  • straightquote :スマートクォートをストレートクォートへ変換
  • markdownquote :各行に引用記号(>)を付与
  • length :文字列長を返す
  • jsonformat :JSONを整形表示
  • uppered/lowered :大文字・小文字変換
  • nato :NATOフォネティック変換(例:bar → Bravo Alfa Romeo)
  • u+ 2025 :Unicodeコードポイントから文字を検索
  • snippets :定型文や記号を素早く挿入

REPL起動系

  • iclj :Clojure REPL
  • ijs :Deno/Node REPL
  • iphp :PHP REPL
  • ipy :Python REPL
  • isql :SQLiteシェル

日付・時間

  • hoy :現在日付をISO形式で表示
  • timer :指定時間後に通知&サウンド
  • rn :現在時刻とカレンダーを表示

音声・動画・画像

  • ocr :画像からテキスト抽出(macOS限定)
  • boop :直前のコマンド成功/失敗で音を鳴らす
  • sfx :効果音を再生
  • tunes :mpvで音楽再生(シャッフル対応)
  • pix :画像表示
  • radio :お気に入りネットラジオ局再生
  • speak :Markdown除去後、テキストを音声で読み上げ
  • shrinkvid :ffmpegで動画圧縮
  • removeexif :JPEGからEXIF情報削除
  • tuivid :ターミナルで動画再生

プロセス管理

  • each :xargsやfind -execの簡易代替
  • running :指定プロセスのPIDとコマンドを見やすく表示
  • murder :プロセスに段階的にkillシグナル送信
  • waitfor :指定PIDの終了待機+スリープ防止
  • bb :コマンドを完全にバックグラウンド実行
  • prettypath :PATH環境変数を見やすく分割表示
  • tryna/trynafail :コマンド成功/失敗まで繰り返し実行

クイックリファレンス

  • emoji :キーワードから絵文字検索
  • httpstatus :HTTPステータスコード一覧・解説
  • alphabet :英字アルファベット大文字小文字一覧

システム管理

  • theme 0/1 :全体のダーク/ライトテーマ切替(Vim, Tmux, ターミナル含む)
  • sleepybear :システムスリープ(macOS/Linux対応)
  • ds-destroy :.DS_Storeファイル一括削除

その他

  • catbin :パス上のコマンドのソース表示
  • notify :OS通知送信
  • uuid :v4 UUID生成

まとめ

  • 紹介したスクリプトは 日常的に役立つもの ばかり
  • dotfilesやシェルスクリプトの活用で 作業効率・安全性向上
  • 「aliasは最終手段」や「A decade of dotfiles」等の関連投稿もおすすめ
  • あなたの お気に入りスクリプト もぜひ共有してください!

Hackerたちの意見

lineスクリプトについてだけど、sedを使えばファイルから任意の行をプリントできるよ。catやhead、tailのパイプラインを使う必要はない。例えば、sed -n 2p fileでファイルの2行目を表示できる。sedの利点は、必要に応じて複数行もプリントできること。sed -n 2,4p fileで2行目から4行目までを表示できるよ。

複数のsedコマンドをチェーンするのはよくあるし、時には順番を入れ替えることもある。その場合、最初のsedを何度も変更しなきゃいけないことがある。sedの前にgrepが必要なこともあるし、cat、tail、headを使うことで、長期的にはもっとモジュール化される気がする。各コマンドが小さなことを一つずつやるっていうのがエトスだね。

これこそHNで一番興味がある内容だな。他の開発者はどうやって働いてるのか、そこから自分の仕事をどう良くできるかっていうのが気になる。最初は「これ、別に必要ないな」と思うことが多いんだけど、実際にその影響(名前があると思うけど、誘発需要に似てるかも)を知ってるから、「$uncommon_taskをもっと安くする」→「$uncommon_taskが新しいワークフローやスキルの基盤になる」っていうのがあるんだよね。だから、ほとんどのスクリプトを試してみて、どれが自分に合うか見てみるつもり!あと、投稿のスタイルがすごく好き。すごく分かりやすいし、著者が各スクリプトをどれくらい使ってるかの貴重な情報も含まれてて、どれが上記の効果を引き起こす可能性が高いか事前に把握できるのがいいね。最後に、私のワークフローについてちょっとした裏話だけど…これらの操作のいくつかや他の時に必要な時は、ブラウザの開発者ツールを開いてJSを使うこともあるよ。例えば、文字列を小文字にする時とかね :)

著者のアプローチとあなたのアプローチのコストベネフィット分析を見てみたいな。著者がスクリプトを作るのにかかった時間、使い方を覚えたり、文法を忘れた時に参照する時間、システムを変更するたびに移行にかかる時間も含めて。

開発者の人生のサイクルって不思議だよね。 - 新人エンジニアの頃は、結構普通のシェル環境を使ってた。 - 1年か2年の経験を積んだ頃には、たくさんのスクリプトやbashエイリアスを書いて、OPと同じように1,000行以上の.bashrcを持ってた。 - 今は、経験15年のエンジニアとして、基本的に余計なものがないバニラシェルが欲しいし、エイリアスやスクリプトも使わず、ネイティブのUNIX実装を使ってる。もっと複雑なことが必要なら、PythonやGoでコーディングするかな。

自分のPythonスクリプトも「スクリプト」って呼ぶよ。スクリプトっていう用語はシェルスクリプトだけに限らないと思う。

一台のnixコンピュータを持っていた時は、かなりカスタマイズしたいと思ってた。でも今は多くのnixコンピュータを持っていて、一貫性を持たせて、必要最低限のパッケージだけをインストールしたいんだ。

一方で、著者はかなりの経験があるみたいだね。個人的には同意することが多いけど、エイリアスにする価値があるものってほんの一部だと思う。自分はエイリアスを少ししか持ってなくて、そのうちの半分くらいしか普段使ってないかな。正直、自分の使い方がどうしてこんなに違うのか不思議だよ。編集:著者の場合、彼は多分ターミナルでフルタイムで生活したいんだろうね。オフラインで。彼はHTTPステータスコードみたいな静的データをたくさん保存してるしね。自分の場合は、ブラウザに入力し始めて、結局100回訪れたことのある何かをクリックしちゃう。冗長なネットワークコールを減らすことには意味があるけど、実際のところあんまり実用的な違いはないと思うし、エイリアスのメンタルマッピングや発見性も無視できないよね。

今、若いエンジニアたちと一緒に仕事をしてるんだけど、みんなドットファイルをたくさん持ってて、「ああ、そういえば自分もたくさん持ってたな。面倒だったなぁ。」って思う。最近はツールを選ぶのにかなり慎重になって、流れに合わせて変わるようにしてるよ。「水のように」って感じかな。ドットファイルを管理するのが好きな人には何の悪口でもないけど、いろんな人がいるからね :)

そうだね、同じ経験があるよ。ショートカットを持つことで得られる時間って、維持したり、使えないマシンで本当の構文を思い出すために必要な時間よりも少ない気がする(自分の場合、これが結構あるんだ)。最近はできるだけシステムのデフォルトを使うようにしてるよ。

また振り返る準備をしておいてね。30年近くの経験から、シェルは必要なものに適応できるし、普遍的に利用できるから、いろんなことの統合ポイントとして最高だと思う。バニラシェルの使い方はスクリプトを書くときだけに減ったよ。

コンピュータが大好きなあなたにとって、こういう感じなんだろうね。私の~/binはいっぱいだよ。もちろん(あなたがそう言ったわけじゃないけど)、"自分がやることはすべて、どのコンピュータでも可能でなければならない"とは思わない。何十年もコンピュータを使ってきたから、自分がやりたいことを調整してきたけど、もしかしてあなたは仕事のことを言ってるのかな?趣味や生活じゃなくて。

これは、何かの啓発的なピークから来ているというより、むしろ怠惰から来ていると思うよ。(同じことをする人間として、そう言ってるんだけどね。)同僚や友達がカスタマイズの深い穴にハマっているのを見ると、いつも面白い新しいツールを学べるんだ。最近は、atuinやfzf、他にもいくつかをLinuxに追加したよ。

ずっとベルカーブのミームだね。

ここにはいくつかクールなことがあるけど、一般的にはこの手のことには標準ユーティリティを使うのが好き。主な理由は、いろんなシステムに出入りするから、個人のエイリアスやスクリプトがほとんどのシステムにないから。sed、awk、grep、xargsと標準ユーティリティを組み合わせると、かなりのことができるよ。

これには完全に同意だね。いろんなシステムで作業することが多いけど、ほとんどのシステムには自分の快適さがないんだ。でも、ほんとに良いツールは残って、デフォルトで使えるくらい影響力があるものになることもあるよね。個人的なスクリプトのコレクションはあまり良くないと思うけど、ちゃんとメンテナンスされたパッケージならいいかも。

trash a.txt b.pnga.txtb.png をゴミ箱に移動する。macOSとLinuxに対応してる。君のやり方だとファイルを順番にゴミ箱に移動するから、ファイルごとにゴミ箱の音が聞こえて、Finderで⌘Zを押しても最後の一つしか復元できないよ。これを改善することもできるけど(自分は何年もやってた)、macOSに付属している trash コマンドを使うのも考えてみて。Finderを使わないから音も出ないし、⌘Zもないけど、速いし公式だし、「戻す」もできるよ。> jsonformat はstdinからJSONを受け取って、stdoutにきれいに表示する。なんでjqじゃなくてnodeを優先するの?後者はコードがかなり少なくて、今ではmacOSにプリインストールされてるよ。> uuid はv4 UUIDを出力する。自分はこれを月に一回くらい使うかな。macOSや多分君のLinuxディストリビューションに付属している uuidgen を使わない理由はあるの? https://www.man7.org/linux/man-pages/man1/uuidgen.1.html

PowerShellではNew-Guidだよ。

Pythonもデフォルトできれいに表示してくれるよ: $ echo '{ "hello": "world" }' | python3 -m json.tool { "hello": "world" }

私は著者じゃないけど、彼はその存在を知らなかったんじゃないかな。自分の設定や知識を共有する一番の利点は、誰かが必ず自分の盲点を明らかにしてくれることだよね。

なぜjqじゃなくてnodeを優先するの? PowerShellではこうやってやってるよ。 echo '{"foo": "bar"} | ConvertFrom-Json | ConvertTo-Json { "foo": "bar" } でも関数としてね。

自分もmkcdを使ってるよ(どれくらいの人が使ってるんだろう、すごく明白だよね)。ほぼ同じものを持ってるけど、名前が違ってて、scratch(day)、copy(xc)、markdown quote(blockquote)、murder、waitfor、trynaとかね。長時間実行されるスクリプトからの通知用に、カスタム通知音付きのtelegram-sendをよく使ってた。毎時または30分ごとに時間を教えてくれるtimespeakっていうのも使ってた。go_cloneっていうのは、GOPATHにリポジトリをクローンするもので、GOPATHにGoプロジェクトを置く必要がなくなった後も、非Goプロジェクトを整理するのに使ってる。自分は一発ものを書くのが好きで、これが早くなるのは早すぎる最適化じゃないと思う。

明らかにそのスクリプトは便利だけど、もしそれがないシステムにいるなら、代わりに以下のことができるよ:mkdir /some/dir、cd !$(またはcd)。

これを一般化しようと思ってるんだけど(ディレクトリターゲット、複数のソース、フラグ)、このunmvスクリプトから結構な恩恵を受けてるんだ、今のままでもね。 #!/bin/sh if test "$#" != 2 then echo 'エラー: unmvはちょうど2つの引数が必要です' exit 1 fi exec mv "$2" "$1"

いいね!ちょっと関連する話だけど、clippyっていう(MacOS専用の)ツールを作ったんだ。pbcopyよりずっと良いものにしたよ。最近、homebrew coreに追加されたんだ。他にもいろいろあって、ファイルを参照として使いたいときに自動で検出して、GUIアプリにアップロードとしてペーストされるんだ、バイトじゃなくて。 clippy image.png # Slackなどにアップロードとしてペースト clippy -r # 最近のダウンロードをコピー pasty # Finderでファイルをコピーして、ここに実際のファイルをペースト https://github.com/neilberkman/clippy / brew install clippy

これ好きだな。

$ cat /usr/local/bin/awkmail
#!/bin/gawk -f
BEGIN {
    smtp="/inet/tcp/0/smtp.yourco.com/25";
    ORS="\r\n";
    r=ARGV[1];
    s=ARGV[2];
    sbj=ARGV[3];
    # /bin/awkmail to from subj
    print |& smtp;
    print "." |& smtp;
    smtp |& getline j;
    print j;
    print "quit" |& smtp;
    smtp |& getline j;
    print j;
    close(smtp);
}
# /inet/protocol/local-port/remote-host/remote-port

俺のお気に入りのスクリプト、何でも解凍できるやつ。数年前にどこかで見つけた。

ex - アーカイブ抽出器

使い方:

ex() {
    if [ -f $1 ] ; then
        case $1 in
            *.tar.bz2) tar xjf $1 ;;
            *.tar.gz) tar xzf $1 ;;
            *.tar.xz) tar xf $1 ;;
            *.bz2) bunzip2 $1 ;;
            *.rar) unrar x $1 ;;
            *.gz) gunzip $1 ;;
            *.tar) tar xf $1 ;;
            *.tbz2) tar xjf $1 ;;
            *.tgz) tar xzf $1 ;;
            *.zip) unzip $1 ;;
            *.Z) uncompress $1;;
            *.7z) 7z x $1 ;;
            *) echo "'$1' は ex() で解凍できません。" ;;
        esac
    else
        echo "'$1' は有効なファイルじゃないよ。"
    fi
}

aunpack が俺には合ってる。