file compressi e relativo contenuto decompresso su share

Installazione, configurazione e uso di Ubuntu come server: web, ftp, mail, news, proxy, dns e altro.
andreapapotti
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: giovedì 22 febbraio 2007, 22:29
Località: Modena
Contatti:

file compressi e relativo contenuto decompresso su share

Messaggio da andreapapotti »

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
Avatar utente
UbuNuovo
Imperturbabile Insigne
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

Messaggio da UbuNuovo »

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.
Salva l'Ucraina! 🇺🇦
andreapapotti
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: giovedì 22 febbraio 2007, 22:29
Località: Modena
Contatti:

Re: file compressi e relativo contenuto decompresso su share

Messaggio da andreapapotti »

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
Avatar utente
UbuNuovo
Imperturbabile Insigne
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

Messaggio da UbuNuovo »

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-)
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
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

Messaggio da UbuNuovo »

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
Salva l'Ucraina! 🇺🇦
andreapapotti
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: giovedì 22 febbraio 2007, 22:29
Località: Modena
Contatti:

Re: file compressi e relativo contenuto decompresso su share

Messaggio da andreapapotti »

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
Avatar utente
UbuNuovo
Imperturbabile Insigne
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

Messaggio da UbuNuovo »

Una birra e 6 miliardi di euro, puoi fare un bonifico su questo iban
P3R QU3574 VOL74 3' GR4715
Ciaux 8-)
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Ubuntu su server”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 14 ospiti