find_external_SlackPkg_files.sh: uno script per maniaci
Moderatore: Staff
1) Citare l'eventuale nome e link dell'articolo della wiki.
2) Specificare se discussione/suggerimento o richiesta d'aiuto.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: find_external_SlackPkg_files.sh: uno script per maniaci
Con questo metodo si è anche risolto il problema con il comando '['.
Fatemi sapere,
Emanuele
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: find_external_SlackPkg_files.sh: uno script per maniaci
Codice: Seleziona tutto
file trovati e installati:
109620 109659 4807338 found_files.s
120551 126501 5011788 installed_files.s
230171 236160 9819126 totale
tempo find:
real 0m23.800s
user 0m1.050s
sys 0m0.910s
tempo sort dei due file:
real 0m0.920s
user 0m1.190s
sys 0m0.080s
tempo comm:
real 0m0.335s
user 0m0.300s
sys 0m0.000s
Emanuele
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: find_external_SlackPkg_files.sh: uno script per maniaci
- gestire solo alcuni casi particolari e noti
- gestire solo i casi particolari creati dal pacchetto aaa_base
- cercare di fare una cosa generica e che vale sempre
Codice: Seleziona tutto
/usr/share/{doc,info,man,pkgconfig}
Codice: Seleziona tutto
/usr/share/{doc,info,man}
Se però si vuole fare qualcosa di più generico si dovrebbero controllare tutti i link simbolici creati dai vari pacchetti. La lista dei link simbolici va comunque creata, però se vogliamo implementare questo algoritmo si deve fare un ciclo del tipo:
Codice: Seleziona tutto
for file in $(<symbolic_links); do [ -d $file ] && reapl_path=$(readlink -m $file); done
- sul mio PC per fare tutto questo ciclo ci mette meno di un secondo e quindi mi sembra una soluzione ancora accettabile. Però il mio PC, come si vede anche dal numero di file trovati da find, è un sistema abbastanza minimale.
- questi controlli sono fatti dopo la 'find' e quindi buona parte dei dati sugli inode, se non tutti, sono ancora in cache.
Emanuele
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: find_external_SlackPkg_files.sh: uno script per maniaci
- migliorato la ricerca dei link simbolici. Questo evita il problema dei file bash e altri che non venivano trovati.
- tramite un analisi post-processo ora:
- ho risolto il problema dei link simbolici a directory (usando il 'for' di cui al post precedente).
- faccio la prune di tutto l'albero di directory lasciando solo la directory madre.
- una 'diff' tra i due output forniti dallo script attuale e dall'RC.
- la differenza di performace ritornata dal comando 'time'. In questo caso però bisognerebbe eseguire il comando due volte e prendere i tempi della seconda volta perché altrimenti il risultato è sfalsato (la prima find impiega molto più tempo).
Codice: Seleziona tutto
/usr/share/fonts/*/fonts.dir mkfontdir
/usr/share/fonts/*/fonts.scale mkfontscale
/usr/share/fonts/*/encodings.dir mkfontdir
/home
/mnt
/opt
/tmp
/usr/share/mime update-mime-database
/var/cache/fontconfig fc-cache
/var/cache/ldconfig ldconfig
/var/tmp/kdecache-* kde-mv
Emanuele
- Allegati
-
- find_external_SlackPkg_files.new.sh
- RC1 del nuovo script
- (8.06 KiB) Scaricato 255 volte
- ZeroUno
- Staff
- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
Re: find_external_SlackPkg_files.sh: uno script per maniaci
La prima sed ha una espressione da 79000 caratteri mentre la seconda è di 91000.
Comunque l'output finale è sceso da 200000 righe 3000 righe
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: find_external_SlackPkg_files.sh: uno script per maniaci
Ma quei 3000 percorsi sono corretti, sono tutti percorsi esterni? Come mai così tanti? Io ne ho si è no una 20 di righe di output.
Emanuele
- ZeroUno
- Staff
- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
Re: find_external_SlackPkg_files.sh: uno script per maniaci
in quella sed togli quello che sta negli exclude path e stai a posto, credospina ha scritto:Sisi, ci ho pensato un po' ed effettivamente non "mi garbano". Inoltre in teoria non funzionerebbero lo stesso per via dei link multipli alla stessa directory. Vedo di fare qualcosa di meglio è più veloce. Ho un'idea ma devo vedere come si comporta.
Sembrerebbe che siano corretti.Ma quei 3000 percorsi sono corretti, sono tutti percorsi esterni? Come mai così tanti? Io ne ho si è no una 20 di righe di output.
Ti ricordo che tu hai un sistema minimale. Io una installazione completa della 13.1, continuamente aggiornata a current con slackpkg (che lascia diversi file di conf .orig), più diversi pacchetti slacky particolari (in particolare le compat32-library che ha la lib/incoming che chiaramente non è gestita dallo script), più programmi installati non pacchettizzati (anche parecchia roba da cpan o da pacchetti proprietari). Altre cose che si potrebbero mettere negli exclude file e poche cose che non ci dovrebbero stare.
Sarebbe opportuno che
1) l'output venisse sparato direttamente in un file anzichè in standard output.
2) in coda si aggiungesse l'elenco degli exclude path
Cosa bella sarebbe anche che a fianco delle directory (e anche degli exclude path) dal momento che è stato tranciato il contenuto venisse almeno mostrato il numero di file al suo interno.
Io intanto per debug ho tolto gli rm e rinominato i due temp_output in temp_output.1 e .2 (idem per temp_output.s).
Matteo
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: find_external_SlackPkg_files.sh: uno script per maniaci
dai, questo no. Se uno vuole un '> file' non ci mette niente a farlo. Quando io eseguo lo script, in genere analizzo l'output. Ora, a me sono poche righe, ma anche un '| more' non ci vuole niente a farlo.ZeroUno ha scritto:Sarebbe opportuno che
1) l'output venisse sparato direttamente in un file anzichè in standard output.
Lo script ha una opzione '-f' che mostra i path filtrati ed esce. Con '-h' ti mostra l'help (sto pensando di gestire anche '--help').ZeroUno ha scritto:2) in coda si aggiungesse l'elenco degli exclude path
Ecco, lo sapevo io. Prima mi chiedi di troncare il contenuto delle directory e poi mi chiedi di mostrare il numero di file . Per quelli fatti a run-time è facile, però per quelli esclusi no, mi costringi ha fare un find anche negli exclude path. Tieni conto che gli exclude path servono anche a velocizzare lo script saltando alberi di directory.ZeroUno ha scritto:Cosa bella sarebbe anche che a fianco delle directory (e anche degli exclude path) dal momento che è stato tranciato il contenuto venisse almeno mostrato il numero di file al suo interno.
Ti allego l'ultimo RC su cui sto lavorando. Mi dici com'è messo questo con i tempi? Ho dovuto modificare l'algoritmo perché c'erano errori logici. Se due link simbolici puntano alla stessa directory (e succede) allora lo script sed ha nella sua linea di comando due RE uguali ma che fanno cose diverse. Questo vuol dire che non controllo tutti i link. Quest'ultimo RC dovrebbe essere corretto, però non so quanto ci mette per eseguirlo, a me il tutto è molto rapido.ZeroUno ha scritto:Io intanto per debug ho tolto gli rm e rinominato i due temp_output in temp_output.1 e .2 (idem per temp_output.s).
Emanuele
- Allegati
-
- find_external_SlackPkg_files.rc3.sh
- RC3 dello script
- (8.07 KiB) Scaricato 237 volte
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: find_external_SlackPkg_files.sh: uno script per maniaci
Emanuele
- Allegati
-
- find_external_SlackPkg_files.rc5.sh
- RC5 dello script
- (8.18 KiB) Scaricato 372 volte
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: find_external_SlackPkg_files.sh: uno script per maniaci
Quale accendiamo?
Emanuele
- Allegati
-
- find_external_SlackPkg_files.rc6.sh
- RC6 dello script
- (8.22 KiB) Scaricato 250 volte
- ZeroUno
- Staff
- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
Re: find_external_SlackPkg_files.sh: uno script per maniaci
Li tiro giù e ti dico.
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
- ZeroUno
- Staff
- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
Re: find_external_SlackPkg_files.sh: uno script per maniaci
Codice: Seleziona tutto
# time bash find_external_SlackPkg_files.rc3.sh > rc3.out
comm: file 1 is not in sorted order
comm: file 1 is not in sorted order
real 0m21.413s
user 0m15.698s
sys 0m6.151s
# time bash find_external_SlackPkg_files.rc5.sh > rc5.out
comm: file 1 is not in sorted order
comm: file 1 is not in sorted order
real 0m17.839s
user 0m11.865s
sys 0m6.079s
# time bash find_external_SlackPkg_files.rc6.sh > rc6.out
comm: file 1 is not in sorted order
comm: file 1 is not in sorted order
real 0m17.408s
user 0m11.689s
sys 0m5.880s
i tre out sono identici, ma diversi da quello di ieri (al netto di file aggiunti oggi), che effettivamente era bacato. dosemu dava un po' di fastidio.
in > l'output di ieri
in < quello di ora
Codice: Seleziona tutto
< /etc/ppp/peers/tmpwvdial
---
> /etc/ppp/peers/usr/share/dosemu/drive_z/tmpwvdial
165c171
< /etc/ppp/tmpoptions
---
> /etc/ppp/usr/share/dosemu/drive_z/tmpoptions
512,513d517
< /etc/tmpresolv.conf
< /etc/tmpwvdial.conf
519a524,525
> /etc/usr/share/dosemu/drive_z/tmpresolv.conf
> /etc/usr/share/dosemu/drive_z/tmpwvdial.conf
537d542
< /etc/wvdial.conf
662,663c667,668
< /usr/X11R6.bak/
< /usr/X11R6/
---
> /usr/X11R6R6.bak/
> /usr/X11R6R6/
2161d2164
< /var/spool/cron/cron.F79hxl/
3118,3119c3120,3121
< /var/spool/cups/tmp/gs_JCqGr5
< /var/spool/cups/tmp/gs_wA2RsW
---
> /var/spool/cups/usr/share/dosemu/drive_z/tmp/gs_WiGgZ0
> /var/spool/cups/usr/share/dosemu/drive_z/tmp/gs_sY3t08
Però adesso devo rilanciarlo senza escludere la /opt ma lì ho sia roba pacchettizzata sia roba non pacchettizzata.
# find /opt/|wc -l
72633
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: find_external_SlackPkg_files.sh: uno script per maniaci
Anche l'output, se non ho capito male, sembra migliorato ulteriormente, no? La differenza sembra che ieri non ripristinava i link, mentre quelli di oggi si. Ad esempio:
Codice: Seleziona tutto
512,513d517
< /etc/tmpresolv.conf
< /etc/tmpwvdial.conf
519a524,525
> /etc/usr/share/dosemu/drive_z/tmpresolv.conf
> /etc/usr/share/dosemu/drive_z/tmpwvdial.conf
Codice: Seleziona tutto
537d542
< /etc/wvdial.conf
Dobbiamo trovare il motivo di quei warning di comm, probabilmente se l'input fosse ordinato ci impiegherebbe meno (voglio passare '--nocheck-order' a comm). Dovrebbe darlo il comm della riga 252 dell'RC6. Fai una prova, mettici prima di quella righa, questo:
Codice: Seleziona tutto
echo "$real_path"
Codice: Seleziona tutto
(( $? != 0 )) && exit
Grazie mille davvero,
Emanuele
P.S. Per curiosità, ma lo script attuale (occhio che l'ho modificato ieri) quanto ci mette? Anche se è ovvio che tira fuori un sacco di file in più.
:edit: Forse ho capito. Alla riga 248, sempre dell'RC6, sostituisci:
Codice: Seleziona tutto
sed -n -i "/${real_path////\\/}\//{s;${real_path}/;${file}/;;w subset.s
Codice: Seleziona tutto
sed -n -i "/^${real_path////\\/}\//{s;${real_path}/;${file}/;;w subset.s
- Procopio
- Linux 3.x
- Messaggi: 844
- Iscritto il: ven 29 lug 2011, 11:50
- Nome Cognome: Matteo Micheletto Oddino
- Slackware: 14.2
- Kernel: 4.4.14
- Desktop: Awesome
- Località: Torino
Re: find_external_SlackPkg_files.sh: uno script per maniaci
Codice: Seleziona tutto
.
real 0m0.033s
user 0m0.000s
sys 0m0.002s
.rc5.
real 0m0.003s
user 0m0.000s
sys 0m0.002s
.rc6.
real 0m0.002s
user 0m0.001s
sys 0m0.001s
questi due comandi non restituiscono nulla entrambi:
Codice: Seleziona tutto
root@darkstar:/tmp# diff find. find.rc5.
root@darkstar:/tmp# diff find.rc5. find.rc6.
root@darkstar:/tmp#
se però li scrivo interi restituiscono un bel po di roba:)
Codice: Seleziona tutto
root@darkstar:/tmp# diff find_external_SlackPkg_files.sh find_external_SlackPkg_files.rc5.sh
168c168
< _check_extern_program comm find mktemp rm sed sort uniq
---
> _check_extern_program awk comm find mktemp readlink rm sed sort uniq
178c178
< exit
---
> exit 0
219c219
< find / -mindepth 1 \( $path_to_prune \) -prune -o -print > found_files
---
> find / -mindepth 1 \( $path_to_prune \) -prune -o \( -type d -printf "%p/\n" \) -o -print | sort > found_files.s
226d225
< # - eliminare lo slash finale delle directory (find non lo inserisce)
228c227
< sed -sn '/^\.\//b print;d;:print n;/^install\//{n;b print};s/^/\//;s/\/$//;p;/\.new$/{s/\.new$//;p};b print' /var/log/packages/* > installed_files
---
> sed -s -n '/^\.\//b print;d;:print n;/^install\//{n;b print};s/^/\//;p;/\.new$/{s/\.new$//;p};b print' /var/log/packages/* > installed_files
231c230,231
< sed -n '/ cd.*; ln /{s/ \+/ /g;s/^ *//;s;\([^ ]* \)\{2\}\([^ ]*\) \([^ ]* \)\{4\}\([^ ]*\) .*;/\2/\4;p;}' /var/log/scripts/* >> installed_files
---
> awk '/^[^#]* cd .*; *ln /{sub(/\/$/,"",$3); if ( match($7,/^\//) ) print $7; if ( $8 == "." ) { sub(/\/$/,"",$7); sub(/.*\//,"/",$7); print "/" $3 $7} else print "/"$3 "/" $8}' /var/log/scripts/* | sort | uniq > symbolic_links.s
> cat symbolic_links.s >> installed_files
240d239
< sort found_files > found_files.s
242c241,263
< comm -23 found_files.s installed_files.s
---
> comm -23 found_files.s installed_files.s | awk 'BEGIN { row = "" }{ if ( row == "" || ! match(row, "/$") || ! match($0, "^" row) ) { print $0; row = $0 } }' > temp_output
>
> comm -13 found_files.s installed_files.s > not_found_files.s
> for file in $(<symbolic_links.s)
> do
> if [ -h $file -a -d $file ]
> then
> real_path=$(readlink -m $file)
> sed -n -i "/${real_path////\\/}\//{s;${real_path}/;${file}/;;w subset.s
> ;d};p;" temp_output
> if [ -s subset.s ]
> then
> comm -23 subset.s not_found_files.s > subset.tmp
> if [ -s subset.tmp ]
> then
> sed -i "/${file////\\/}/s;$file;$real_path;;" subset.tmp
> cat subset.tmp >> temp_output
> fi
> fi
> fi
> done
>
> sort temp_output
Codice: Seleziona tutto
root@darkstar:/tmp# diff find_external_SlackPkg_files.rc5.sh find_external_SlackPkg_files.rc6.sh
241c241
< comm -23 found_files.s installed_files.s | awk 'BEGIN { row = "" }{ if ( row == "" || ! match(row, "/$") || ! match($0, "^" row) ) { print $0; row = $0 } }' > temp_output
---
> comm -3 --output-delimiter=$'\t' found_files.s installed_files.s | awk -F '\t' 'BEGIN { row = "" }{ if ( match($0, "^\t") ) { print $2 >> "not_found_files.s" } else { if ( row == "" || ! match(row, "/$") || ! match($0, "^" row) ) { print $0; row = $0 } } }' > temp_output
243d242
< comm -13 found_files.s installed_files.s > not_found_files.s
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: find_external_SlackPkg_files.sh: uno script per maniaci
C'è qualcosa che non va. I tempi sono troppo bassi ed il primo diff dovrebbe restituire qualcosa. Sei sicuro che i file 'find.rc?.' contengano righe? Secondo me è successo qualche errore durante l'invocazione.Procopio ha scritto:ecco i tempi sui tre script: l'originale, rc5 e rc6. Lo script originale sul mio sistema trova 5.489 files, l'ho eseguito da root.Codice: Seleziona tutto
. real 0m0.033s user 0m0.000s sys 0m0.002s .rc5. real 0m0.003s user 0m0.000s sys 0m0.002s .rc6. real 0m0.002s user 0m0.001s sys 0m0.001s
questi due comandi non restituiscono nulla entrambi:Codice: Seleziona tutto
root@darkstar:/tmp# diff find. find.rc5. root@darkstar:/tmp# diff find.rc5. find.rc6. root@darkstar:/tmp#
Emanuele