Skrypt bashowy wyświetlający drzewko struktury katalogów

01 grudnia, 2010

Po tym jak ostatnio na zajęciach uczyliśmy się trochę basha, naszła mnie ochota, aby napisać skrypt który wypisze strukturę katalogów w postaci ładnego drzewka.

Oto co powstało:

#!/bin/sh
 
# Title         : tree
# See           : https://gist.github.com/743432
# Date          : 2010-12-16
# Author        : Damian Skrodzki <damienix1@gmail.com>
# Description   : Prints directory tree
 
clr_dir='\033[1;34m' # Blue
clr_fil='\033[0;33m' # Yellow
clr_rst='\033[0m'    # Text Reset
 
chain() {
# $1 $2 - no change
# $3 - prefix for this dir
# $4 - prefix for nexts
	[ -d "$1" ] && COLOR=$clr_dir || COLOR=$clr_fil
	printf "$2$3$COLOR %s$clr_rst\\n" "${1##*/}"
	[ -d "$1" ] && showBranch "$1" "$2$4"
}
 
# Prints branch and recursive its childs
showBranch() {
# $1 - current dir
# $2 - current prefix
	for i in "$1/"* ; do
		set -- "$i" "$2" "$3"
		[ -z "$3" ] || chain "$3" "$2" '|--' '|  '
		set -- '' "$2" "$1"
	done
	[ -z "$3" ] || chain "$3" "$2" '`--' '   '
}
 
shopt -s dotglob        # show also hidden files using *
shopt -s nullglob       # return empty when pattern doesn't match
 
dir=${1:-$PWD}
if ! [ -d "$dir" ]; then
	echo "$dir: not a directory" >&2
	exit 1
else
	printf "$clr_dir%s$clr_rst\\n" "$dir"
	showBranch "$dir" ' '
fi
 

Jako parametr można podać mu ścieżkę przeszukania, a jak nie to wyświetli wszystko z aktualnego katalogu.

Tree

EDIT: Po licznych wskazówkach, podpowiedziach tudzież naganach, oraz mojej walce z bashem, updatuję kod. Dzięki rozwiązaniu miny86 udało mi się pozbyć szalonych awków oraz radzić ze spacjami w nazwach. Dziękuję! ;) Niestety jeśli chodzi o znaki nowej linii to przyznam się, że dalej nie jest kolorowo.
EDIT2: Wklejona wersja kodu została zmodyfikowana przez minę86, źródło link.

Napisane w Bash, Linux, Programowanie, Techblog | 40 komentarzy

Kategorie

Archiwum

Promocja


  • internetbezchamstwa

  • RSS