file compressi e relativo contenuto decompresso su share
-
- Scoppiettante Seguace
- Messaggi: 349
- Iscrizione: giovedì 22 febbraio 2007, 22:29
- Località: Modena
- Contatti:
file compressi e relativo contenuto decompresso su share
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
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
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
- UbuNuovo
- Imperturbabile Insigne
- Messaggi: 4446
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: file compressi e relativo contenuto decompresso su share
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.
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.
Salva l'Ucraina!
-
- Scoppiettante Seguace
- Messaggi: 349
- Iscrizione: giovedì 22 febbraio 2007, 22:29
- Località: Modena
- Contatti:
Re: file compressi e relativo contenuto decompresso su share
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
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
- UbuNuovo
- Imperturbabile Insigne
- Messaggi: 4446
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: file compressi e relativo contenuto decompresso su share
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:
il primo script è questo:
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-)
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
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
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-)
Salva l'Ucraina!
- UbuNuovo
- Imperturbabile Insigne
- Messaggi: 4446
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: file compressi e relativo contenuto decompresso su share
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:
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
Salva l'Ucraina!
-
- Scoppiettante Seguace
- Messaggi: 349
- Iscrizione: giovedì 22 febbraio 2007, 22:29
- Località: Modena
- Contatti:
Re: file compressi e relativo contenuto decompresso su share
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
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
- UbuNuovo
- Imperturbabile Insigne
- Messaggi: 4446
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: file compressi e relativo contenuto decompresso su share
Una birra e 6 miliardi di euro, puoi fare un bonifico su questo iban
P3R QU3574 VOL74 3' GR4715
Ciaux 8-)
P3R QU3574 VOL74 3' GR4715
Ciaux 8-)
Salva l'Ucraina!
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 14 ospiti