Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)

From Sistemi Operativi
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$$