Difference between revisions of "ProvaPratica 2013.07.18"
Jump to navigation
Jump to search
Line 138: | Line 138: | ||
if __name__ == "__main__": | if __name__ == "__main__": | ||
sys.exit(Main(sys.argv)) | sys.exit(Main(sys.argv)) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | <syntaxhighlight lang="Bash"> | ||
+ | #! /bin/bash | ||
+ | |||
+ | BornAgainFede () { | ||
+ | for f in $1/*; do | ||
+ | bn=$(basename $f) | ||
+ | if [[ -f $f ]] ; then | ||
+ | if [[ -h $2/$bn ]] ; then | ||
+ | i=1 | ||
+ | while [[ -h $2/$bn$i ]] ; do | ||
+ | i=$i+1 | ||
+ | done | ||
+ | ln -s $1/$bn $2/$bn$i | ||
+ | else | ||
+ | ln -s $1/$bn $2/$bn | ||
+ | fi | ||
+ | #ln -s $1/$bn $2/$bn | ||
+ | fi | ||
+ | if [[ -d $f ]] ; then | ||
+ | BornAgainFede $1/$bn $2 | ||
+ | fi | ||
+ | done | ||
+ | } | ||
+ | |||
+ | BornAgainFede $1 $2 | ||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 20:02, 24 November 2013
[Python 3]
'''
Prova Pratica di Laboratorio di Sistemi Operativi
18 luglio 2013
Esercizio 3
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.07.18.pdf
@author: Tommaso Ognibene
'''
import os, sys
def Main(argv):
# Check number of arguments
if len(argv) != 3:
print("The function requires two arguments to be passed in.")
return
# Check parameters
srcDir = str(argv[1])
dstDir = str(argv[2])
if not os.path.isdir(srcDir):
print("First argument should be an existing directory.")
return
if not os.path.isdir(dstDir):
print("Second argument should be an existing directory.")
return
# Build a dictionary with key-value pair {file base name - occurrences}
nameFreq = { }
for dirPath, dirNames, fileNames in os.walk(srcDir):
for fileName in fileNames:
fileBaseName, _ = os.path.splitext(fileName)
nameFreq[fileBaseName] = nameFreq.get(fileBaseName, -1) + 1
# Create a soft link
freq = nameFreq[fileBaseName]
linkName = "{0}{1}".format(fileBaseName, str(freq) if freq > 0 else "")
srcPath = os.path.join(os.path.abspath(dirPath), fileName)
dstPath = os.path.join(dstDir, linkName)
if not os.path.lexists(dstPath):
os.symlink(srcPath, dstPath)
print("Done!")
if __name__ == "__main__":
sys.exit(Main(sys.argv))
Questa è la mia versione
import os, sys
def collectfiles(arg1,arg2):
fcd = os.listdir('{0}'.format(arg1))
while fcd != []:
B=str(fcd.pop())
C='{0}/{1}'.format(arg1,B)
if os.path.isdir('{0}'.format(C)):
collectfiles(C,arg2)
elif os.path.isfile('{0}'.format(C)):
try:
os.symlink('{0}'.format(C), '{0}/{1}'.format(arg2,B))
except OSError:
i=1
while True:
try:
os.symlink('{0}'.format(C), '{0}/{1}{2}'.format(arg2,B,i))
break
except OSError:
i=i+1
try:
collectfiles(str(sys.argv[1]),str(sys.argv[2]))
except OSError:
print("Invalid Directory!")
-Fede
Leggendo la tua versione ho pensato che in effetti se i file sono """pochi""" l'hash-table non e' necessaria. E' sufficiente un controllo iterativo.
'''
Prova Pratica di Laboratorio di Sistemi Operativi
18 luglio 2013
Esercizio 3
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.07.18.pdf
@author: Tommaso Ognibene
'''
import os, sys
def Main(argv):
# Check number of arguments
if len(argv) != 3:
print("The function requires two arguments to be passed in.")
return
# Check parameters
srcDir = str(argv[1])
dstDir = str(argv[2])
if not os.path.isdir(srcDir):
print("First argument should be an existing directory.")
return
if not os.path.isdir(dstDir):
print("Second argument should be an existing directory.")
return
# Traverse the directory tree and create a soft link for each file
for dirPath, _, fileNames in os.walk(srcDir):
for fileName in fileNames:
# 'example.pdf' -> 'example'
# 'example.xml' -> 'example'
fileBaseName, _ = os.path.splitext(fileName)
linkName = fileBaseName
srcPath = os.path.join(os.path.abspath(dirPath), fileName)
dstPath = os.path.join(dstDir, linkName)
i = 0
while os.path.isfile(dstPath):
# 'example' will point to 'example.pdf'
# 'example1' will point to 'example.xml'
i += 1
linkName = fileBaseName + str(i)
dstPath = os.path.join(dstDir, linkName)
if not os.path.lexists(dstPath):
os.symlink(srcPath, dstPath)
print("Done!")
if __name__ == "__main__":
sys.exit(Main(sys.argv))
#! /bin/bash
BornAgainFede () {
for f in $1/*; do
bn=$(basename $f)
if [[ -f $f ]] ; then
if [[ -h $2/$bn ]] ; then
i=1
while [[ -h $2/$bn$i ]] ; do
i=$i+1
done
ln -s $1/$bn $2/$bn$i
else
ln -s $1/$bn $2/$bn
fi
#ln -s $1/$bn $2/$bn
fi
if [[ -d $f ]] ; then
BornAgainFede $1/$bn $2
fi
done
}
BornAgainFede $1 $2