Last active
          October 4, 2025 00:20 
        
      - 
      
- 
        Save yokawasa/abf581a5fcbe6fe97d197dd1a0bf57f6 to your computer and use it in GitHub Desktop. 
    AWK version of tree command
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | #!/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 | |
| } | |
| } | |
| ' | 
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment
  
            
スクリプトでできること:
指定したディレクトリ以下のファイル・ディレクトリ構造をツリー形式で表示
実行例:
$ 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 ... 途中省略...動作環境:
一般的なUNIX/Linux/Mac環境なら大体動くはずです
スクリプトのポイント:
function is_dir(path, ...)の中でtest -dを使い、AWKからシェルコマンドを実行して結果を取得。また、AWKのgetlineとcloseを活用sub("^" dir, "", $0)で、文字列の先頭から特定部分を削除split($0, parts, "/")でパスを分割し、配列partsに格納for文で階層に応じたインデントを動的に作成