Trovare links morti e file inutili con Bash

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

Mi sono messo in una bega, ho accettato di fare la manutenzione di un sito statico antichissimo (un sito web, non archeologico).
È su server windows, fatto con frames, strutturato in tabelle, senza CSS; scandaloso!

Problema da correggere numero 1: i files sono spesso nominati con nomi maiuscoli (anche con spazi) e richiamati da links minuscoli o viceversa (su win funzionano)
Problema numero 2 questo obbrobrio ha circa 240MB di files tutti insieme: tra pagine html e immagini , vorrei eliminare pagine e immagini non più collegate.

Questo lavoro lo farei per me, per rendermi il lavoro più agevole; se "il tipo" (un amico di un amico) avesse voluto spendere gli avrei rifatto il sito dinamico.

Se qualcuno ha qualche idea di come sia più conveniente procedere si faccia avanti, grazie.
Ho qualche idea su come procedere ma se avete già fatto qualcosa del genere apprezzerei una dritta.
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Trovare links morti e file inutili con Bash

Messaggio da vaeVictis »

Problema da correggere numero 1: i files sono spesso nominati con nomi maiuscoli (anche con spazi) e richiamati da links minuscoli o viceversa (su win funzionano)
Problema numero 2 questo obbrobrio ha circa 240MB di files tutti insieme: tra pagine html e immagini , vorrei eliminare pagine e immagini non più collegate.
E quindi?
Nel senso... indichi il problema, ma non come lo vuoi risolvere.
Che cambiamenti vuoi fare?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da crap0101 »

ma non è che esiste già qualcosa del genere? (chiedo perchè proprio non so)
btw, la prima soluzione ovvia che mi viene in mente è crawl-are il tutto con wget e (probabilmente in un secondo momento) verificare e listare quali sono i link morti, e quindi eliminarli.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

@Vae
Quello che vorrei fare è scritto dopo i "vorrei" nella descrizione del problema, ovvero
nel primo caso dovrei rinominare tutti i file in minuscolo e sostituire gli spazi con underscore,
(da 'NoMe del File.Htm' a 'nome_del_file.htm' e questo è facile! Solo che dopo dovrei sostituire i tag

Codice: Seleziona tutto

'<a href="NoMe del File.Htm">' con
'<a href="nome_del_file.htm">
'.
Avrei pensato di salvare su file di testo temporaneo i nomi vecchi di tutti i file, e non ci sono problemi,
rinominare tutti file in modo corretto, e non ci sono problemi,
salvare su file di testo temporaneo i nomi corretti di tutti i file, e non ci sono problemi,
sostituire con sed in tutti i file .htm nome_vecchio con nome nuovo
è qui che potrebbero esserci diversi modi di agire, io avrei pensato di mettere i nomi vecchi e i nomi corretti in due array e poi fare la sostituzione con sed del vecchio_nome con il nuovo_nome_corretto su tutti i file.
Tu come faresti?

Per il secondo problema estrarrei tutti i collegamenti interni (ad altre pagine e immagini) dalla pagina index.html e stessa cosa farei sulle pagine individuate dai links recuperati.
Con due livelli di ricerca ovvero index->categorie dovrei intercettare tutte le pagine collegate.
Quando ho tutti gli indirizzi di pagine e immagini dovrei verificarne l'esistenza per trovare collegamenti interrotti.
Per eliminare i file inutili dovrebbe bastare eliminare i file .htm, .png, .gif, .jpg non presenti nel totale degli URL trovati.
Spero di essermi spiegato.

Il tutto è a livello teorico, prima di cominciare a scrivere il codice mi piacerebbe sentire se esistono procedimenti migliori.

@Crap
Vorrei fare la cosa offline in locale, fuori dal server web, se metto questo sito su Apache non funziona quasi nulla e non posso fare le prove sul sito in produzione.
Io in effetti non ho link morti ma pagine e immagini orfane.
Comunque bonificato il sito in locale poi via ftp cancellerei i file non necessari.

edit: se esiste qualcosa di già pronto va bene ugualmente.
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

Ci ho ripensato, potrei usare il metodo di Crap.
Se faccio una "scansione" con wget ottengo tutte le pagina che sono collegate alle pagine genitrici quindi le orfane non appaiono.
Se faccio la differenza con l'elenco delle pagine che ho realmente, con l'elenco delle pagine trovate da wget ottengo le pagine orfane da eliminare.
Si molto meno macchinoso.
Grazie Crap

Edit: per individuare le differenze che mi consigliate: studiare 'diff' o qualche altro metodo?
Salva l'Ucraina! 🇺🇦
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da crap0101 »

dipende dall'output, diff potrebbe andare bene
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
Manaphy91
Prode Principiante
Messaggi: 185
Iscrizione: venerdì 1 aprile 2011, 14:08

Re: Trovare links morti e file inutili con Bash

Messaggio da Manaphy91 »

Statico o meno i cambi in corsa non si fanno mai e su questo ci sei: tu stesso hai detto di volerlo fare prima in locale, giusto per sicurezza... e questa è cosa buona e giusta!!
Scripting a parte, di cui potrei consigliarti ben poco, ti suggerisco di portare tutto in locale e di sottoporre al controllo di versione(io sarei per git) la directory contenente l'intero sito, in modo da poter tornare indietro in qualsiasi momento essendo anche un po' più fault tolerant... che di certo non fa male.
Ultima modifica di Manaphy91 il mercoledì 19 giugno 2013, 0:55, modificato 1 volta in totale.
Il test di un programma può essere usato per mostrare la presenza di bug, ma mai per mostrare la loro assenza(cit. Edsger Dijkstra)
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

Si ma le modifiche le farei inizialmente solo in locale, dove ho una copia speculare del sito remoto, (gli esperimenti li farei su una copia della copia.
Con wget non modifico niente, scarico soltanto.
Git finora non l'ho mai usato, avevo cominciato a studiarlo ma come mi capita spesso, sono passato di palo in frasca, ci sono troppi argomenti interessanti.
Comunque gli esperimenti comincierò a farli sabato o domenica, ora non ho tempo.

Per il primo problema? Avete qualche altro procedimento da proporre?
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: Trovare links morti e file inutili con Bash

Messaggio da melfnt »

sed ha l'opzione I che non tiene conto delle mauscole e minuscole.

Una volta rinominati i file togliendo spazi e maiuscole, salva una lista dei nomi dei file rinominati da qualche parte e usa sed per sostituirli con il nome gisto in tutti gli altri file.

Per esempio: file input.txt

Codice: Seleziona tutto

ciao mondo
Ciao mONDO
cio smcjf
siowene fijwe
cIAo MonDo
comando

Codice: Seleziona tutto

sed 's/ciao mondo/ciao_mondo/gI' input.txt > output.txt
output.txt:

Codice: Seleziona tutto

ciao_mondo
ciao_mondo
cio smcjf
siowene fijwe
ciao_mondo
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

Grazie melfnt, è proprio quello che ho intenzione di fare, domani proverò a scrivere un po di codice, in teoria dovrei riuscirci senza problemi, poi se trovo intoppi mi rifaccio vivo.
Salva l'Ucraina! 🇺🇦
Francesco Biagio
Prode Principiante
Messaggi: 4
Iscrizione: venerdì 21 giugno 2013, 13:06

Re: Trovare links morti e file inutili con Bash

Messaggio da Francesco Biagio »

Anche io ho il tuo stesso problema, non so come faree!
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Trovare links morti e file inutili con Bash

Messaggio da vaeVictis »

UbuNuovo [url=http://forum.ubuntu-it.org/viewtopic.php?p=4410162#p4410162][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Grazie melfnt, è proprio quello che ho intenzione di fare, domani proverò a scrivere un po di codice, in teoria dovrei riuscirci senza problemi, poi se trovo intoppi mi rifaccio vivo.

Codice: Seleziona tutto

vaevictis@HAL:~/Scrivania$ cat foo.txt
ciao mondo
Ciao mONDO
cio smcjf
siowene fijwe
cIAo MonDo
vaevictis@HAL:~/Scrivania$ cat foo.txt | tr '[A-Z ]' '[a-z_]'
ciao_mondo
ciao_mondo
cio_smcjf
siowene_fijwe
ciao_mondo
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

Ancora più semplice, il sistema è ottimo, ma probabilmante userò sed in modo da usare le regexp, altrimenti potrei filtrare con le 'grep -P' e mettere il risultato in pipe a 'tr', domani sperimento.
Grazie Vaevictis.
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

Ho guardato il man di sed e mi pare che non si possano usare le PECRE, ho visto giusto o c'è un modo?

edit: sto facendo confusione, stavo pensando ad un'altro sistema, se agisco direttamente sui file per la sola sostituzione non devo usare le regex
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: Trovare links morti e file inutili con Bash

Messaggio da melfnt »

vaeVictis [url=http://forum.ubuntu-it.org/viewtopic.php?p=4410608#p4410608][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
UbuNuovo [url=http://forum.ubuntu-it.org/viewtopic.php?p=4410162#p4410162][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Grazie melfnt, è proprio quello che ho intenzione di fare, domani proverò a scrivere un po di codice, in teoria dovrei riuscirci senza problemi, poi se trovo intoppi mi rifaccio vivo.

Codice: Seleziona tutto

vaevictis@HAL:~/Scrivania$ cat foo.txt
ciao mondo
Ciao mONDO
cio smcjf
siowene fijwe
cIAo MonDo
vaevictis@HAL:~/Scrivania$ cat foo.txt | tr '[A-Z ]' '[a-z_]'
ciao_mondo
ciao_mondo
cio_smcjf
siowene_fijwe
ciao_mondo
Già, il metodo è più semplice, ma a lui serve di sostituire solo alcuni nomi (in questo caso la stringa "ciao mondo") e non tutto il contenuto del file...

altrimenti si ritroverebbe un file html TUTTO MAIUSCOLO e con _ invece che spazi
;)
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

Per chiarirmi/vi le idee userò 'tr 'per rinominare i file e mette da parte i nomi, invece sed per fare le sostituzioni.

Per ora la rinominazione è quasi pronta, ho fatto qualche prova e questo è il risultato, devo fare altre prove .

# precisazioni
L'intero sito è nella dir 'sito', ma credo che farò 'cd sito' e userò '.' in find per non avere il nome della dir nei risultati.
Per ora ho 'echo' sulla rinomina.

Codice: Seleziona tutto

sep_default="$IFS"
IFS='
'
for i in $(find sito -type f); do 
nuovo_nome=$(echo "$i" | tr '[A-Z ]' '[a-z_]')
echo mv "$i" "$nuovo_nome"; done
done	# non va 'i' prende parte del nome dei file con gli spazi

IFS="$sep_default"
ho dovuto cambiare il separatore altrimenti $i mi prendeva pezzi di file con gli spazi.

Per mettere da parte i nomi che serviranno per la sostituzione, ho fatto un po di prove, mettendoli su file, su variabile ma credo che userò gli array per ciclarli in sed.

Codice: Seleziona tutto

# Prova array 

declare -a vecchi_nomi=("$(find sito -type f)")
#verifica
for nome_vecchio in "${vecchi_nomi[@]}"; do
   echo "$nome_vecchio"
done											#OK

declare -a nuovi_nomi=($(find sito -type f | tr '[ A-Z]' '[_a-z]'))
# verifica
for nome_nuovo in "${nuovi_nomi[@]}"; do
   echo "$nome_nuovo"
done											# OK
Ora per verifica devo:contare, ordinare e usare 'unique' sugli array vecchi_nomi e nuovi_nomi, per vedere se ci fossero file eliminati dalla rinomina. Altrimenti devo fare un controllo sull'esistenza del file prima di rinominarlo, cosa che avevo già fatto in un'altro script.
Ora devo però interrompere, ho da fare il casalingo, (sono felicemente divorziato) : )
Ultima modifica di UbuNuovo il sabato 22 giugno 2013, 11:00, modificato 1 volta in totale.
Salva l'Ucraina! 🇺🇦
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: Trovare links morti e file inutili con Bash

Messaggio da melfnt »

Se hai problemi a leggere i nomidei file che contengono spazi (da rinominare con tr), tempo fa avevo sperimentato questo:

Codice: Seleziona tutto

find . -type f >.p
 while read item
 do
  ......
  ......
  ......
 done < .p
rm .p
In pratica stampa la lista dei nomi dei file su un altro file temporaneo (.p) e nel ciclo lo legge riga per riga.

In questo modo nel nome del file comprende anche gli spazi
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

@melfnt purtoppo devo usare il separatore modificato anche sugli array, ora spiego il perchè.

Appena incominciato mi sono subito bloccato, stesso problema degli spazi, anche nell'array

Codice: Seleziona tutto

declare -a vecchi_nomi=($(find sito -type f))
echo "${#vecchi_nomi[@]}"
#output: 2360

declare -a nuovi_nomi=($(find sito -type f | tr '[ A-Z]' '[_a-z]'))
echo ${#nuovi_nomi[@]}
#output: 1755
vuol dire che ci sono 2360-1755=605 file con gli spazi.
Quindi ho dovuto reimpostare IFS con l'a capo.

Codice: Seleziona tutto

IFS='
'
declare -a vecchi_nomi=($(find sito -type f))
echo "${#vecchi_nomi[@]}"
#output: 1755

declare -a nuovi_nomi=($(find sito -type f | tr '[ A-Z]' '[_a-z]'))
echo ${#nuovi_nomi[@]}
#output: 1755
Ora il terminale mi fa confondere, invece di eseguire il codice che incollo mi esegue quello vecchio! Bo??
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

Porka vakka, è venuto fuori un problema su un sito devo interrompere!
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Trovare links morti e file inutili con Bash

Messaggio da UbuNuovo »

È casinoso lavorare con gli array in Bash! Potevano avere una sintassi array=('bal bla', "Mario D'Ambrosio",...)? Avrebbe semplificato tutto!
Tra virgolette: si o no e cambio di separatore ci sono diventato scemo.
Comunque a tentativi sono arrivato ad ottenere gli array che volevo:

Codice: Seleziona tutto

IFS='
'
declare -a vecchi_nomi=("$(find "$path" -type f)")
# ordino e levo i record doppi
vecchi_nomi_unici=($(sort -u <<< "${vecchi_nomi[*]}"))
echo "${#vecchi_nomi_unici[@]}"
1755

declare -a nuovi_nomi=("$(find "$path" -type f | tr '[ A-Z]' '[_a-z]')")
nuovi_nomi_unici=($(sort -u <<< "${nuovi_nomi[*]}"))
echo "${#nuovi_nomi_unici[@]}"
1755
Come si vede non c'è perdita di file, quindi per ora non ci metto la funzione di controllo per i nomi duplicati, semmai la metto da ultimo insieme ai controlli e all'acquisizione argomenti, in modo da fare uno script utile agli altri.

Ora ho tutto quello che serve per fare le sostituzioni con sed, solo che tra mezzora, anzi 20 minuti devo andare via... per oggi non lo finisco quesco script, maremma impestata!
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti