模拟tree命令

tree就是把文件和目录按树形列出。这很有趣,可Cygwin里没有这个包。于是,我编写了一个脚本,模拟一下tree的基本功能。

Code

#!/bin/bash

# TREE Tool for Cygwin   

# Functions
lines() {
    line=
    for t in `eval echo {0..$level}`;do
        line="${line}\t|"
    done
}
list_files() {
    files=(.* *)
    for file in ${files[@]};do
        if [ ! "$file" = '.' -a ! "$file" = '..' -a ! "$file" = '*' ];then
            if [ -d "$file" ];then
                echo -e "${line}\e[34;1m$file\e[0m/"
                change_dir
            elif [ -L "$file" ];then
                echo -e "${line}\e[36;1m$file\e[0m@"
            elif [ -x "$file" ];then
                echo -e "${line}\e[32;1m$file\e[0m*"
            else
                echo -e "${line}$file"
            fi
        fi
    done
}
change_dir() {
    cd "$file"
    ((level++))
    lines
    list_files
    cd ..
    ((level--))
    lines
}

#Start

#init
t=0
level=0
lines
cd "$*"

echo "$PWD"
list_files
exit

 

原理

转到\$*所指示的目录后,显示所有文件,包括隐藏文件,并对可执行文件、链接文件、目录标上标记,如果是目录,就进入,继续执行这些步骤,并进行适当的缩进,目录全部显示后,退回上级目录,并减少缩进,直到全部文件被显示。

将此文件放在/usr/local/bin下,进行适当的命名,如rtree,设置可执行权限(如果需要),即可使用。

建议

请不要打印/proc等特殊目录,会进入死循环。

其他

运行中按Ctrl-c可终止。