Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)
Jump to navigation
Jump to search
Esercizio 3: Script bash o Python: (10 punti):
Scrivere un programma python o uno script bash che conti l'ampiezza totale in byte di tutti i file di una directory divisi per suffisso
(i.e. Si considera suffisso tutto cio' che segue il primo carattere 'punto' nel filename). I file privi di suffisso vengono ignorati.
Es:
$ suffixlen dir
.c: 44320
.o: 123000
.tar.gz: 555333
.jpg: 44332
Soluzione di Federico Giuggioloni usando bash
#!/bin/bash
DIR=$1
echo
for NAME in `find $DIR -name "*.*" -exec basename {} \; | sort -u -k2 -t.` ; do
if [[ $NAME != *"."* ]] ; then
continue
fi
SUFFIX=${NAME#*.}
echo -ne ".${SUFFIX}: "
TEST=`find $DIR -name "*.${SUFFIX}" -exec wc -c {} + | tail -1`
echo $TEST | cut -d " " -f 1
done
echo
Soluzione di Federico Giuggioloni usando Python (2.7.6)
Non so come eliminare lo spazio aggiunto dalla print tra gli elementi separati dalla virgola. Per il resto l'output è lo stesso di quello in bash.
import os
import sys
rootdir = sys.argv[1]
extsize = {}
print
for root, subFolders, files in os.walk(rootdir):
for file in files:
fp = os.path.join(root, file)
size = os.path.getsize(fp)
extension = file.split(".")[-1]
if extension in extsize:
extsize[extension] += size
else:
extsize[extension] = size
for key in extsize:
print ".", key, ":", extsize[key]
print
Soluzione di Eddy
- Inizialmente ho esportato l'array associativo, per permettere alla subshell che eseguiva il while di usare extmap del padre, ma non riesco a capire come mai non funzioni, cosi` ho usato un file temporaneo
export extmap
find $1 -name "?*.*" -type f | while read path
...
- soluzione
#!/bin/bash
declare -A extmap
find $1 -name "?*.*" -type f > /tmp/tmp$$
while read path
do
fullname=`basename "$path"`
ext=${fullname#?*.} #non considero il punto dei file nascosti
filesize=`wc -c "$path" | awk '{print $1}'`
let "sum=${extmap["$ext"]}+$filesize"
extmap["$ext"]="$sum"
done < /tmp/tmp$$
for ext in "${!extmap[@]}"
do
echo "$ext - ${extmap["$ext"]}"
done
rm /tmp/tmp$$