シェルで関数型プログラミング
Unix パイプラインを関数合成として捉え、map/filter/foldの基本部品でログ解析やデータ処理を行う方法
いざというときにサッとコマンドが出てこないので、コピペ用に残しておきます。
# リモートからローカルに引き上げ(sudo権限付き)ssh host "sudo tar cz /var/log/nginx" | tar xzv --strip-components=3
# ローカルからリモートに送信tar cz . | ssh host "tar xz -C /path/to/dest"古いCentOSサーバーからログを引き上げる必要がありました。
rsync を使おうとしたら:
-bash: rsync: command not foundEOLでリポジトリが死んでいて、yum install rsync も通りません。
scp で済まそうとしたら:
scp: /var/log/nginx/access.log: Permission deniedログディレクトリはroot権限が必要です。scpにはsudoを挟む術がありません。
こういうときに tar + ssh のパイプが役立ちます。
ssh host "tar cz /path/to/dir" | tar xzリモートの /path/to/dir がローカルのカレントディレクトリに展開されます。
ssh host "sudo tar cz /var/log/nginx" | tar xzv --strip-components=3--strip-components=3 で /var/log/nginx/… の先頭3階層を削り、nginx/… として展開します。
ssh host "tar cz /path/to/data" | tar xz -C ./backup/ディレクトリを送って展開:
tar cz . | ssh host "tar xz -C /path/to/dest"アーカイブとして保存:
tar cz directory | ssh host "cat > backup.tar.gz"tar cz /data | pv | ssh host "tar xz -C /backup"pv を挟むと転送速度が見えます。
tar cz /deploy | tee >(ssh server1 "tar xz -C /app") \ >(ssh server2 "tar xz -C /app") > /dev/nullパスの先頭からN階層を削除します。
/var/log/nginx/access.log │ │ │ 1 2 3 ← strip-components=3 で nginx/access.log になります展開側(パイプの右側)で指定します。
# ○ 正しいssh host "tar cz /path" | tar xz -C ./dest/
# × 意味がない(圧縮側で -C しても展開先は変わらない)ssh host "tar cz -C /path ." | tar xz| オプション | 形式 | 用途 |
|---|---|---|
| z | gzip | 通常はこれで十分 |
| j | bzip2 | 圧縮率優先 |
| J | xz | 最高圧縮率、遅い |
| 状況 | 推奨 |
|---|---|
| 単発の小さいファイル | scp |
| 定期同期・差分転送 | rsync |
| rsyncがない・sudo必要 | tar + ssh |
--strip-components でパス階層を調整可能Unix パイプラインを関数合成として捉え、map/filter/foldの基本部品でログ解析やデータ処理を行う方法
Linuxのプロセス管理の仕組みと、Hyprland の正しい起動方法について
タスクの期限・見積もり時間・優先度から1日の作業時間上限を守りながらスケジュールを自動生成するCLI/TUIタスク管理ツールTaskdogを開発した話