Skip to content

Instantly share code, notes, and snippets.

@yokawasa
Last active October 4, 2025 00:20
Show Gist options
  • Save yokawasa/abf581a5fcbe6fe97d197dd1a0bf57f6 to your computer and use it in GitHub Desktop.
Save yokawasa/abf581a5fcbe6fe97d197dd1a0bf57f6 to your computer and use it in GitHub Desktop.
AWK version of tree command
#!/bin/sh
# 指定ディレクトリまたは現在のディレクトリを使用
[ -d "$1" ] && DIR=$1 && shift || DIR=.
# ディレクトリを絶対パスに変換
(cd ${DIR}; pwd)
# ディレクトリ内のファイルとサブディレクトリをツリー表示
find "${DIR}" | \
awk -v dir="${DIR}" '
function is_dir(path, cmd, result) {
cmd = "test -d \"" dir path "\" && echo 1 || echo 0"
cmd | getline result
close(cmd)
return result == 1
}
{
sub("^" dir, "", $0) # 先頭ディレクトリパス削除
if ($0 == "") next # 空行スキップ
n = split($0, parts, "/") # パスをスラッシュで分割
indent = ""
for (i = 2; i < n; i++) indent = indent " "
name = parts[n]
if (is_dir($0)) {
# ディレクトリは青色
print indent "+---\033[34m " name "\033[0m"
} else {
# ファイルは色なし
print indent "+-- " name
}
}
'
@yokawasa
Copy link
Author

yokawasa commented Jul 19, 2025

スクリプトでできること:

指定したディレクトリ以下のファイル・ディレクトリ構造をツリー形式で表示

実行例:

$ awk-tree <path-to-dir>

+-- LICENSE
+-- CHANGELOG.md
+--- out
   +--- test
      +-- runTest.js.map
      +-- runTest.js
      +--- suite
         +-- index.js
         +-- extension.test.js.map
         +-- index.js.map
         +-- extension.test.js
   +-- extension.js.map
   +-- extension.js
+-- .vscodeignore
+--- node_modules
   +--- is-plain-obj
... 途中省略...
Screenshot 2025-07-20 at 9 17 07

動作環境:

一般的なUNIX/Linux/Mac環境なら大体動くはずです

  • gawk, nawk, mawk, macOSのawkなど、ほとんどの現代的なAWKで動作
  • 非常に古いAWKやbusyboxのawkでは動かない可能性がある

スクリプトのポイント:

  1. 外部コマンドとの連携: function is_dir(path, ...) の中で test -d を使い、AWKからシェルコマンドを実行して結果を取得。また、AWKの getlineclose を活用
  2. 文字列操作・パターンマッチ: sub("^" dir, "", $0) で、文字列の先頭から特定部分を削除
  3. 配列とsplit関数: split($0, parts, "/") でパスを分割し、配列 partsに格納
  4. ループとインデント生成: for文で階層に応じたインデントを動的に作成
  5. 条件分岐と色付け出力: ディレクトリとファイルで出力を変える条件分岐を行い、ANSIエスケープシーケンスで色付け設定

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment