08/08/2008 - Linux Feed

LINUX « E-Pillole



Visualizzare struttura ad albero di una directory

Post inserito il 06/11/2007 da Fede in Easy Tricks

Per svariati motivi, a volte si ha la necessità di rappresentare "graficamente" la struttura ad albero di una directory e di tutto ciò che tale directory contiene.

Ad esempio, visualizzare ricorsivamente il contenuto di una directory, può essere utile se si deve presentare la struttura di un proprio progetto, oppure molto più semplicemente può darci una mano per non perdere l'orientamento su una macchina priva di interfaccia grafica e che magari non conosciamo come le nostre tasche :)

Tree apache2

Per ottenere tale risultato, lo strumento più comodo ed intuitivo che io conosca, è senza dubbio TREE, rilasciato sotto licenza GPL e impacchettato "da sempre" sia per Debian che per Ubuntu :)

Ovviamente, essendo il sorgente disponibile in download direttamente dal sito uffciciale, TREE è comodamente installabile su qualsiasi distribuzione Linux.

Sarà sufficiente estrarre l'archivio scaricato:

tar -zxvf tree-1.5.1.1.tgz

spostarsi all'interno della directory che verrà creata, e digitare:

make && sudo make install

Per Debian e Ubuntu, come sempre, basterà invece affidarsi al nostro miglior amico, apt, e digitare:

sudo apt-get install tree

Completata l'installazione, spulciamo un pochino tra le varie opzioni disponibili dando un rapido sguardo all'help e alle man pages:

tree --help

man tree

e facciamo qualche semplice esempio:

fede@C-DEB:~/src/tree/tree-1.5.1.1$ tree -pshu
.
|-- [-rw-r--r-- fede     5.2K]  CHANGES
|-- [-rw-r--r-- fede      18K]  LICENSE
|-- [-rw-r--r-- fede     1.6K]  Makefile
|-- [-rw-r--r-- fede     3.3K]  README
|-- [drwxr-xr-x fede     4.0K]  man
|   |-- [-rw-r--r-- fede     7.5K]  tree.1
|   `-- [-rw------- fede     6.8K]  tree.1.fr
|-- [-rwxr-xr-x fede      35K]  tree
|-- [-rw-r--r-- fede      50K]  tree.c
`-- [-rw-r--r-- fede      46K]  tree.o

1 directory, 9 files

Carino vero?? Ancora meglio, aggiungendo la formattazione dei caratteri in UTF-8 :)

tree -pshu --charset=UTF-8

Come si può intuire facendo un pò di prove qua e la, da qualsiasi posizione ci si trova, è possibile passare a TREE la directory di cui vogliamo visualizzare la struttura ad albero e persino greppare il contenuto della stessa:

fede@C-DEB:~$ tree -pshu src/tree/tree-1.5.1.1 | grep tree
src/tree/tree-1.5.1.1
|   |-- [-rw-r--r-- fede     7.5K]  tree.1
|   `-- [-rw------- fede     6.8K]  tree.1.fr
|-- [-rwxr-xr-x fede      35K]  tree
|-- [-rw-r--r-- fede      50K]  tree.c
`-- [-rw-r--r-- fede      46K]  tree.o

al contrario, se non verrà passata nessuna directory, TREE stamperà la struttura della directory in cui ci si trova al momento.

Ovviamente, è altrettanto possibile redirezionare l'output del comando ad un file di testo:

tree -pshu /etc/apache2 --charset=utf8 > ~/Desktop/apache2_tree

e non solo, come avrete probabilmente notato dalle man pages, aggiungendo -H tra le opzioni, TREE è in grado di formattare l'output in HTML, ed è quindi possibile creare dei files consultabili direttemante via browser, digitando molto semplicemente:

tree -pshu -H /etc/apache2 /etc/apache2 --charset=utf8 > ~/Desktop/tree.html

Per la sua semplictà e per quello che è in grado di fare, considero TREE uno strumento davvero utile, e per l'occasione eccovi uno scriptino da utilizzare in nautilus tramite il quale sarà sufficiente cliccare sulla "cartella" di cui si vuole visualizzare la struttura ad albero, e verrà creato un file con il contenuto desiderato :)

Come ben saprete, i nostri scripts per nautilus vanno posizionati all'interno della directory ~/.gnome2/nautilus-scripts/, quindi, creiamo il nostro file:

gedit ~/.gnome2/nautilus-scripts/DirTREE

ed incolliamo quanto segue:

#!/bin/bash

current_dir=`pwd`

if [ -d "$1" ]; then
	q=$(zenity --title="DirTREE" --list --width=250 --height=180 \
	--text="Choose file format..." --radiolist --column "Choose" --column \
	"File format" FALSE "TEXT" FALSE "HTML");
		if [[ $q = "TEXT" ]]; then
			save_to=$(zenity --title="DirTREE -- Save $1 TREE to..." \
			--save --file-selection --confirm-overwrite \
			--filename="${current_dir//\//_}_$1_TREE");
			tree -pshu $current_dir/$1 --charset=utf8 > $save_to
		elif [[ $q = "HTML" ]]; then
			save_to=$(zenity --title="DirTREE -- Save $1 TREE to..." \
			--save --file-selection --confirm-overwrite \
			--filename="${current_dir//\//_}_$1_TREE.html");
			tree -pshu -H $current_dir/$1 $1 \
			-T $current_dir/$1_TREE --charset=utf8 > $save_to
		fi
else
	info=`file $1`
	zenity --title="DirTREE" --error --no-wrap \
	--text="ERROR: You must select a directory!!\
	\r\rSELECTED FILE: $current_dir/$1\r\rFILE INFO ==>> $info"
fi

exit 0

Per creare le finestre di dialogo tramite cui scegliere il formato del file e la posizione dove salvarlo, viene utilizzato zenity, quindi, se è il caso installatelo:

sudo apt-get install zenity

rendete poi eseguibile lo script appena creato:

chmod +x ~/.gnome2/nautilus-scripts/DirTREE

riavviate nautilus e troverete TREE a portata di click :)

Naturalmente, modificate lo script secondo le vostre esigenze, e chissà, magari potrebbe anche tornarvi utile :)


Post letto 1485 volte | Commenti (8) | Bookmark   del.icio.us    segnalo


Commento postato da montag il 07/11/2007
Questo proprio non lo conoscevo...
Grazie mille per la segnalazione!

Commento postato da Arthur il 08/11/2007
Ciao Fede...un po' di tempo è passato ed ora sono nuovamente carico di interrogativi da riversarti contro; sono tuttavia interrogativi elementari (non per me) anche se assolutamente OT (ma non saprei a chi chiedere). Il mio problema è il seguente: con la mia Debian (assolutamente stable) sono connesso alla rete per mezzo di un router 3com...riconosce tutto automaticamente senza alcun mio intervento...ma il problema è che sono sempre connesso e non mi è possibile isolare il pc dalla rete se non entrando in modalità d'amministrazione. L'operazione è fattibile ma rognosissima poiché vorrei rapidamente disabilitare la connessione e riavviarla altrettanto velocemente nel momento dell'effettivo bisogno. Ho letto qualche soluzione al riguardo...ma nessuna mi soddisfa poiché ognuna di queste passa per il conferimento allo user (me-stesso-user) di diritti che il me-stesso-root non vuole concedere. A questo punto ho pensato una genialata teorica (semplicissima ma ipso facto geniale) tuttavia non supportata da alcun elemento tecnico (eh sì, sono un genio ignorante :-)). Ho pensato, e te ne chiedo conferma, che fosse possibile modificare un runlevel (il terzo ad esempio) in modo tale che non abbia accesso alla rete...indi rapidamente passare con un telinit 3 ad una condizione assolutamente uguale al runlevel 2 di default isolato tuttavia dalla rete, e con un altrettanto semplice telinit 2 riconquistare alla bisogna l'accesso ad internet. In primo luogo: è una ca**ata epocale? Se fosse possibile (e qui entra in gioco la tua competenza e la tua cortesia) come posso operare? Non ricordo il nome (ma non è un problema) dell'utilità di configurazione dei runlevel (mi pare sysvrc..o simile)...ma il punto è: la connessione è regolata da un demone ch'io possa disabilitare a piacimento? E soprattutto, tale demone è presente nella lista di servizi di sysvrc? Ha un nome questo demonio maledetto? Grazie e scusa il pippone infinito (la logorrea non è guaribile, solo curabile).

Commento postato da Fede il 08/11/2007
@Arthur

ciao :)

secondo me tu sei un poeta o uno scrittore :)

anyway...

il metodo + rapido ed indolore per evitare di prendere l'IP dal router ed isolarti momentamente è di digitare:

sudo /etc/init.d/networking stop

e per riabilitarla:

sudo /etc/init.d/networking start

ovviamente è necessario inserire la password...

dato che la pass ti serve anche per agire sui run levels direi che è inutile passare da un run level all'altro...dopotutto è una password...che sarà mai ;)

ciaociao

Commento postato da Arthur il 09/11/2007
Grazie innanzitutto (non per il poeta...matacchione) per la linearità e coerenza del tuo elegante comando (sudo /etc/init.d/networking stop...a me pare un verso!!), ma vorrei tormentarti ancora su questo punto.
Ciò ch'io vorrei è configurare il runlevel 3 come runlevel snello e sicuro: niente cupsys, cron, ecc. ecc....e niente internet. Ora per la stampa, cron ed altre risolvo la questione mediante l'utility sysv-rc-conf, o comunque modificando i nomi dei collegamenti in /etc/rc3.d (K al posto di S, no?), mentre per quello che ho ormai inteso chiamarsi NETWORKING la faccenda è più complessa poiché lo script si avvia al boot e quindi il collegamento non è presente in rc2-3-4-5.d bensì in rcS.d (oltreché in rc0.d e rc6.d), ed interessa qundi tutti i runlevel multiusers, fors'anche il livello single-user. In effetti in sysv-rc-conf alla voce corrispondente non è indicato nulla per i runlevel in questione...e se lo disabilitassi dal level S immagino che lo disattiverei in assoluto. Inoltre in S sono presenti anche i collegamenti a ifupdown e ifupdown-clean (anche questi non presenti nei levels da 1 a 5). da quali tra questi (networking, ifudown, ifupdownclean) dipende la connessione ad inetrnet? Come lasciare l'avvio al boot della connessione (in level S) ma preservando dalla medesima l'utopico level 3? Io non vorrei disattivare il demone ma impedirgli di rompermi le balle se passo a level 3...con un telinit 3 (comando elegantissimo) vorrei entrare di colpo in uno spazio scevro di servizi non sempre utili ed isolato dalla rete. Sento che si può fare...ma non so come. Dammi un po' di teoria sennò muoio!!!
Poi avrei un altro paio di curiosità (due in una) ancor più, anzi veramente stupide...ma queste alla prossima puntata. Ciao

Commento postato da Arthur il 09/11/2007
Matacchione è volutamente con una sola "t".

Commento postato da Fede il 10/11/2007
@Arthur

ma tutto questo è per un puro scopo accademico voglio sperare :)

sinceramente, non saprei come spiegare la "faccenda" dei runlevels sintetizzando tutto il discorso :(

ma davvero tu cambieresti runlevel via telinit come si faceva nella preistoria ?? :)

ciaociao

Commento postato da Arthur il 10/11/2007
Io sono un uomo preistorico !!
Eppoi mi pare semplice ed elegante il passaggio da un runlevel all'altro con telinit....è come ordinare al ghiaccio di diventar acqua, vapore eppoi nuovamente ghiaccio. In effetti telinit trasforma lo "stato" della macchina semplicemente dicendoglielo; tipo un "alzati e cammina". Amo la sintesi e i gesti semplici capaci di grande trasformazioni piuttosto che molti piccoli tocchi di magia. Al fine d'aver una macchina più snella (ricordo che il mio pc è un prodotto dell'industria portoghese di fine '800) e sicura (non connessa) ho pensato che configurare un runlevel con il minimo necessario per le operazioni che solitamente svolgo fosse una buona idea. Alla fine il problema si riduce solo a questo: uno script nel runlevel S parte al boot, e quindi ha valore per tutti i runlevels (da 1 a 5); non esiste link a networking in rc1-5.d poiché la sua presenza in rcS.d lo qualifica come script di un runlevel speciale (cioé la rete è attiva prima del login). L'unico problema è capire come non fare ca**ate. Ho provato a mettere in rc3.d un collegamento a networking (k20networking), ed in effetti arresta la connessione, ma appena ritorno al runlevel 2 essa pare ripristinarsi senza però l'effettiva possibilità di navigare (devo ravviare). Ho pensato anche (ma l'ho solo pensato) di togliere networking da rcS.d e metterlo in rc2.d (s20networking) mentre nel rc3.d il bel k20networking. Temo di fare danni...per questo ho bisogno della tua teoria.

Commento postato da Fede il 10/11/2007
@Arthur

>>Temo di fare danni...per questo ho bisogno della tua teoria...

eh...okkio perchè è un attimo mandare a pu**ane qualche cosa...!! :)

così a occhio, con il tuo ragionamento (togliere networking da rcS.d) , la prima cosa che mi viene in mente che può incasinarsi è NFS et similia...ma non ci giurerei...

a quest'ora poi... :)

ciaociao

Commenta Post

(opzionale)
(opzionale)


Codice antispam: Codice antispam