Difference between revisions of "Esercizio 3, prova pratica, 18-07-2013"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "==Testo== <source lang="text"> 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...")
 
 
Line 48: Line 48:
 
Scan(sys.argv[1])
 
Scan(sys.argv[1])
  
 +
</source>
 +
 +
==Soluzione di MV==
 +
<source lang="bash">
 +
#! /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
 
</source>
 
</source>

Latest revision as of 08:24, 19 May 2015

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