Esercizio 3, prova pratica, 18-07-2013
Jump to navigation
Jump to search
Testo
Scrivere un programma python o uno script bash che cataloghi per nome tutti i file presenti in un sottoalbero.
nameindex dir1 dir2
crea nel file dir2 un link simbolico ad ogni file contenuto nell'albero che ha come radice dir1. Quando sono presenti piu' file
con lo stesso nome in diverse directory all'interno di dir1, viene posto un suffisso numerico al nome del link simbolico
se dir1 contiene i file pippo, pluto e paperino e la directory paperopoli e quest'ultima contiene i file paperino, qui quo e qua,
all'interno di dir2 divranno essere contenuti i seguenti link simbolici:
pippo → dir1/pippo
pluto → dir1/pluto
paperino → dir1/paperino
paperino1 → dir1/paperopoli/paperino
qui → dir1/paperopoli/qui
quo → dir1/paperopoli/quo
qua → dir1/paperopoli/qua
Soluzione di Krusty
import os, sys
from stat import *
exist={}
def Scan(pathname):
for f in os.listdir(pathname):
path = os.path.join(pathname,f)
s = os.stat(path)
if S_ISREG(s.st_mode):
if f not in exist:
exist[f] = 1
os.symlink(path,f)
else:
n = exist[f]
exist[f] = exist[f] + 1
os.symlink(path,(f+str(n)))
elif S_ISDIR(s.st_mode):
Scan(path)
#main
if not os.path.isdir(sys.argv[2]):
os.makedirs(sys.argv[2])
os.chdir(sys.argv[2])
Scan(sys.argv[1])
Soluzione di MV
#! /bin/bash
if (( $# != 2 ))
then
echo "Usage: nameindex dir1 dir2"
exit 1
fi
if [[ $1 = /* ]] # verifico se $1 è un path assoluto o relativo (è necessario assoluto per i link)
then
dir1=$1
else
dir1=`pwd`/$1
fi
for i in `find $dir` # scandisco l'albero
do
if [ -f $i ]
then
filename=`basename $i` # ricavo il nome del file senza percorso
if [ ! -f $2/$filename ] # se è il primo file trovato con quel nome
then # creo il link con lo stesso nome
ln -s $dir1/$i $2/$filename
else # altrimento cerco il primo numero n>0 non ancora usato come suffisso
n=1
while [ -f $2/${filename}${n} ]
do
(( n=$n+1 ))
done
ln -s $dir1/$i $2/$filename$n
fi
fi
done