file compressi e relativo contenuto decompresso su share

Installazione, configurazione e uso di Ubuntu come server: web, ftp, mail, news, proxy, dns, ecc.

file compressi e relativo contenuto decompresso su share

Messaggioda andreapapotti » venerdì 9 agosto 2019, 10:41

Buongiorno,
i miei utenti paciugoni non riconoscono la differenza tra file compresso e decompresso, col risultato che salvano entrambe sul fileserver, intasandolo.
Esiste un utility o uno script gia fatto che mi permetta di capire, data una cartella, quali file compressi vi sono all'interno (zip e rar soprattuto) e se ne coesiste la versione decompressa? Così da poter identificare (ed eventualmente eliminare) una delle due versioni? Immagino possa essere possibile costruirsi in casa uno script che cerchi tutti i file comrpessi, ne estrapoli l'hash/nomefile dei file all'interno e lo paragoni agli altri file nella share, ma va al di la delle mie competenze di scripting!!
Grazie a chiunque mi possa dare una direzione per la risoluzione del problema :)
La pirateria uccide il software libero! SE POTETE ( O MEGLIO DIRE "DOVETE")  ACQUISTATE SEMPRE LICENZE ORIGINALI!
Quando la gente si accorge ke office costa 350€ probabilmente valuterà l'uso di OpenOffice!!
Visita il sito della mia band  : http://www.cheersband.it
andreapapotti
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 349
Iscrizione: febbraio 2007
Località: Modena

Re: file compressi e relativo contenuto decompresso su share

Messaggioda UbuNuovo » sabato 10 agosto 2019, 13:45

In testa un procedimento ce l'avrei.
Farei così:
Scansione con find di tutti i file della directory share, il risultato lo inserisco in una variabile mettiamo $file_tutti
Con un ciclo while read sulle righe di $file_tutti, eseguo grep per individuare i file zip e i file rar,
eseguo il comando file sui ogni file "greppato", assicurandomi che i file siano zip o rar:
se il file è uno zip eseguo un procedimento
se il file è un rar eseguo un altro procedimento

in entrambi i procedimenti devo leggere l'indice dell'archivio compresso.
Per gli zip uso unzip -l "$nome_archivio"
Per i rar uso unrar l "$nome_archivio"

ottenuto l'indice dei file dell'archivio, con un ciclo su questo elenco, cerco con grep il nome del file compresso, all'interno di $file_tutti; se lo trovo, ho già: il nome dell'archivio, il nome del file compresso e il path del file decompresso.
Scompatto il file da confrontare (usando unzip per gli zip e unrar per i rar).
Ora posso confrontarli generando un hash md5sum per ognuno dei due file, se gli hash risultano uguali, sposto il file decompresso in un'altra directory-cestino o lo cancello direttamente.

Quindi devi installare: unzip e unrar e file (probabilmente sono già installati)
Sicuramente ci sarànno da filtrare gli output dei vari comandi; con: grep, sed, awk dovresti fare tutto.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3396
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: file compressi e relativo contenuto decompresso su share

Messaggioda andreapapotti » lunedì 12 agosto 2019, 7:33

fantastico! faccio delle prove! grazie mille
La pirateria uccide il software libero! SE POTETE ( O MEGLIO DIRE "DOVETE")  ACQUISTATE SEMPRE LICENZE ORIGINALI!
Quando la gente si accorge ke office costa 350€ probabilmente valuterà l'uso di OpenOffice!!
Visita il sito della mia band  : http://www.cheersband.it
andreapapotti
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 349
Iscrizione: febbraio 2007
Località: Modena

Re: file compressi e relativo contenuto decompresso su share

Messaggioda UbuNuovo » lunedì 12 agosto 2019, 16:41

Aspetta!
Ho fatto lo script come l'avevo pensato, funge ma è una ciofeca!
Per soli due comandi diversi ho un sacco di codice ripetuto.
Conviene: impostare un flag a zip o rar; eseguire un solo ciclo interno con il codice comune, e solo in caso di codice diverso, controllare il flag ed eseguire il codice adatto.

Mi creo una struttura di prova con questo codice:
Codice: Seleziona tutto
dir='share'
mkdir "$dir"
for i in $(seq 1 100);do echo "$(cat /dev/urandom | tr -dc 'a-zA-Z0-9-\!@#$%^&*()_+~' | fold -w 123 | head -n 3)" > "$dir/file_${i}";done
mkdir -p $dir/{dir1,dir_1a,dir_1b,dir_1c,dir2,dir2,dir3}
# metto alcuni file nelle dir 1, 2 e 3 spostandoli e nelle dir _1a, _1b _1c copiandoli in modo da avere alcuni archivi unici e altri con doppioni
mv $dir/file_{1..15} $dir/dir1
mv $dir/file_{16..23} $dir/dir2
mv $dir/file_{24..50} $dir/dir3
cp $dir/file_{51..58} $dir/dir_1a
cp $dir/file_{59..69} $dir/dir_1b
cp $dir/file_{70..95} $dir/dir_1c
# comprimo dir1 dir3 dir_1b con zip
# di dir1 lascio l'originale per avere un doppione
zip -r $dir/dir1.zip $dir/dir1
zip -rm $dir/dir3.zip $dir/dir3
zip -rm $dir/dir_1b.zip $dir/dir_1b
# comprimo dir2 dir_1a dir_1c con rar
rar a $dir/dir2.rar $dir/dir2
# di dir2 lascio l'originale per avere un doppione
rar a -df $dir/dir_1a.rar $dir/dir_1a
rar a -df $dir/dir_1c.rar $dir/dir_1c



il primo script è questo:
Codice: Seleziona tutto
#!/bin/bash
# Scritto il 12 agosto 2019
# Sposta nel cestino, i file scompattati, già presenti in archivi compressi.
# Da eseguire dalla directory contenente la directory share
# Da fare:
# ottimizzare! Il codice ha troppe ripetizioni,
# inserire controlli su esistenza di file e directory, e per errori dai comandi

path='share'
file_tutti=$(find "$path" -type f -print)
archivi_comp=$(grep -E '.*\.(zip$|rar$)' <<< "$file_tutti")
dir_temp='/tmp/scompat/'
# cestino e log  a livello di share, per non comparire nei risultati di find
cestino="cestino"
f_log="log_spostamento_doppioni.txt"

[ -d "$dir_temp" ] || mkdir -p "$dir_temp"
[ -d "$cestino" ] || mkdir -p "$cestino"

echo -e "\nData esecuzione script: $(date +"%Y-%B-%d %H:%M:%S")\n" >> "$f_log"

while read archivio; do
   if grep -q '^Zip' < <(file -b "$archivio"); then
         f_path=$(unzip -l "$archivio" | grep -o "$path.*$" | sed '1,2d')
         while read fp;do
            f=$(basename "$fp")
            if grep -q "$f$" <<< "$file_tutti";then
               f_libero=$(grep "$f$" <<< "$file_tutti")
               f_scomp=$(unzip -j "$archivio" "$fp" -d "$dir_temp")
               md5_scomp=$(md5sum "$dir_temp$f" | cut -d " " -f1)
               md5_comp=$(md5sum "$f_libero" | awk '{print $1}')
               if [ "$md5_scomp" = "$md5_comp" ]; then
                  echo -e "[$(date +"%H:%M:%S.%N")]\tIl file \"$f\" in \"$archivio\" è uguale al file \"$f_libero\". Sposto nel cestino il file \"$f_libero\"" >> "$f_log"
                  mv "$f_libero" "$cestino"
               fi
               rm -f "$dir_temp/"*
            fi
         done <<< "$f_path"
      elif grep -q '^RAR' < <(file -b "$archivio") ; then
         f_path=$(unrar l "$archivio" | grep -o "$path.*$" | sed '1d;$d')
         while read fp;do
            f=$(basename "$fp")
            if grep -q "$f$" <<< "$file_tutti";then
               f_libero=$(grep "$f$" <<< "$file_tutti")
               f_scomp=$(unrar e "$archivio" "$fp" "$dir_temp")
               md5_scomp=$(md5sum "$dir_temp$f" | awk '{print $1}')
               md5_comp=$(md5sum "$f_libero" | cut -d " " -f1)
               if [ "$md5_scomp" = "$md5_comp" ]; then
                  echo -e "[$(date +"%H:%M:%S.%N")]\tIl file \"$f\" in \"$archivio\" è uguale al file \"$f_libero\". Sposto nel cestino il file \"$f_libero\"" >> "$f_log"
                  mv "$f_libero" "$cestino"
               fi
               rm -f "$dir_temp/"*
            fi
         done <<< "$f_path"
      else
         echo "Il file $archivio non è un archivio rar o zip" >> "$f_log"
   fi
done <<< "$archivi_comp"

# elimino eventuali dir vuote
find "$path" -type d -empty -delete

echo -e "\nFinito! 8-)\nIl log degli spostamenti è scritto sul file \"$f_log\""

exit


Semmai poi provalo su una copia dei tuoi file reali.

I due cicli while interni sono praticamente uguali, eccetto che per i comandi unrar e unzip.
Conviene eliminare un ciclo interno e fare (pseudocodice): if flag=zip then unzip... elif flag=rar then unrar...
Questo nell'estrazione dell'indice e poi nell'estrazione del file compresso.

Oggi ho troppo caldo e non ne ho più voglia, se hai problemi rifaccio lo script quand'è più fresco! 8-)
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3396
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: file compressi e relativo contenuto decompresso su share

Messaggioda UbuNuovo » martedì 13 agosto 2019, 9:56

Ho levato un ciclo while, roba di cinque minuti a 25 °C.
Si potrebbe fare di meglio, poi vanno messi alcuni controlli e gestione degli errori, ma lascio a te il divertimento. 8-)
secondo script:
Codice: Seleziona tutto
#!/bin/bash
# Scritto da UbuNuovo il 13 agosto 2019
# Sposta nel cestino, i file scompattati, già presenti in archivi compressi.
# Da eseguire dalla directory contenente la directory share
# Da fare:
# inserire controlli su esistenza di file, e per errori dei comandi

path='share'
file_tutti=$(find "$path" -type f -print)
archivi_comp=$(grep -E '.*\.(zip$|rar$)' <<< "$file_tutti")
dir_temp='/tmp/scompat/'
# cestino e log  a livello di share, per non comparire nei risultati di find
cestino="cestino"
f_log="log_spostamento_doppioni.txt"

[ -d "$dir_temp" ] || mkdir -p "$dir_temp"
[ -d "$cestino" ] || mkdir -p "$cestino"

echo -e "\nData esecuzione script: $(date +"%Y-%B-%d %H:%M:%S")\n" >> "$f_log"

while read archivio; do
   if grep -q '^Zip' < <(file -b "$archivio"); then
         tipo='zip'
         f_path=$(unzip -l "$archivio" | grep -o "$path.*$" | sed '1,2d')
      elif grep -q '^RAR' < <(file -b "$archivio") ; then
         tipo='rar'
         f_path=$(unrar l "$archivio" | grep -o "$path.*$" | sed '1d;$d')
      else
         echo "Il file $archivio non è un archivio rar o zip" >> "$f_log"
   fi
         while read fp;do
            f=$(basename "$fp")
            if grep -q "$f$" <<< "$file_tutti";then
               f_libero=$(grep "$f$" <<< "$file_tutti")
               if [ "$tipo" = "zip" ]; then
                     f_scomp=$(unzip -j "$archivio" "$fp" -d "$dir_temp")
                  elif [ "$tipo" = "rar" ];then
                     f_scomp=$(unrar e "$archivio" "$fp" "$dir_temp")
               fi
               md5_scomp=$(md5sum "$dir_temp$f" | cut -d " " -f1)
               md5_comp=$(md5sum "$f_libero" | awk '{print $1}')
               if [ "$md5_scomp" = "$md5_comp" ]; then
                  echo -e "[$(date +"%H:%M:%S.%N")]\tIl file \"$f\" in \"$archivio\" è uguale al file \"$f_libero\". Sposto nel cestino il file \"$f_libero\"" >> "$f_log"
                  mv "$f_libero" "$cestino"
               fi
               rm -f "$dir_temp/"*
            fi
         done <<< "$f_path"

done <<< "$archivi_comp"

# elimino eventuali dir vuote
find "$path" -type d -empty -delete

echo -e "\nFinito! 8-)\nIl log degli spostamenti è scritto sul file \"$f_log\""

exit
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3396
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: file compressi e relativo contenuto decompresso su share

Messaggioda andreapapotti » mercoledì 14 agosto 2019, 11:46

Grandissimo!! Quanto ti devo?? :)
La pirateria uccide il software libero! SE POTETE ( O MEGLIO DIRE "DOVETE")  ACQUISTATE SEMPRE LICENZE ORIGINALI!
Quando la gente si accorge ke office costa 350€ probabilmente valuterà l'uso di OpenOffice!!
Visita il sito della mia band  : http://www.cheersband.it
andreapapotti
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 349
Iscrizione: febbraio 2007
Località: Modena

Re: file compressi e relativo contenuto decompresso su share

Messaggioda UbuNuovo » mercoledì 14 agosto 2019, 12:33

Una birra e 6 miliardi di euro, puoi fare un bonifico su questo iban
P3R QU3574 VOL74 3' GR4715
Ciaux 8-)
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 3396
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile


Torna a Ubuntu su server

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 4 ospiti

cron