Come calcolare un hash per una stringa (url) in bash per la cache di wget
Domanda
Sto costruendo un piccolo strumento che scaricherà i file usando wget, leggendo gli URL da file diversi. Lo stesso URL può essere presente in file diversi; l'URL può anche essere presente in un file più volte. Sarebbe inefficace scaricare una pagina più volte (ogni volta che il suo URL viene trovato nell'elenco).
Pertanto, l'approccio semplice è salvare il file scaricato e indicare a wget di non scaricarlo di nuovo se è già lì.
Sarebbe molto semplice; tuttavia gli URL sono molto lunghi (molti parametri GET) e quindi non possono essere usati come tali per i nomi di file (wget fornisce l'errore "Impossibile scrivere su ... [] nome file troppo lungo").
Quindi, ho bisogno di rinominare i file scaricati. Ma affinché il meccanismo di memorizzazione nella cache funzioni, lo schema di ridenominazione deve implementare & Quot; one url & Lt; = & Gt; un nome " ;: se un determinato url può avere più nomi, la memorizzazione nella cache non funziona (ad esempio, se ho semplicemente numerato i file nell'ordine in cui sono stati trovati, non permetterò a wget di identificare quali URL sono già stati scaricato).
Lo schema di ridenominazione più semplice sarebbe calcolare un hash md5 del nome file (e non del file stesso, che è ciò che fa md5sum); ciò garantirebbe che il nome file sia univoco e che un determinato url abbia sempre lo stesso nome.
È possibile farlo in Perl, ecc., ma può essere fatto direttamente in bash o usando un'utilità di sistema (RedHat)?
Soluzione
Sembra che tu voglia l'utilità di sistema md5sum.
URLMD5=`/bin/echo $URL | /usr/bin/md5sum | /bin/cut -f1 -d" "`
Se vuoi creare solo l'hash sul nome del file, puoi ottenerlo rapidamente con sed:
FILENAME=`echo $URL | /bin/sed -e 's#.*/##'`
URLMD5=`/bin/echo $FILENAME | /usr/bin/md5sum | /bin/cut -f1 -d" "`
Nota che, a seconda della tua distribuzione, il percorso per cut
potrebbe essere /usr/bin/cut
.
Altri suggerimenti
Non ho il rappresentante per commentare la risposta, ma c'è un chiarimento nella risposta di Epsilon Prime: per impostazione predefinita, echo stamperà una nuova riga alla fine del testo. Se vuoi che le somme md5 corrispondano a ciò che verrà generato da qualsiasi altro strumento (ad esempio php, md5 di Java, ecc.) Devi chiamare
echo -n "$url"
che sopprimerà la nuova riga.
Altre opzioni sulla mia casella Ubuntu (Precise):
-
echo -n $STRING | sha512sum
-
echo -n $STRING | sha256sum
-
echo -n $STRING | sha224sum
-
echo -n $STRING | sha384sum
-
echo -n $STRING | sha1sum
-
echo -n $STRING | shasum
Altre opzioni sul mio Mac:
-
echo -n $STRING | shasum -a 512
-
echo -n $STRING | shasum -a 256
- ecc.
Le versioni più recenti di Bash forniscono un array associativo, nonché un array indicizzato . Qualcosa del genere potrebbe funzionare per te:
declare -A myarray
myarray["url1"]="url1_content"
myarray["url2"]=""
if [ ! -z ${myarray["url1"]} ] ; then
echo "Cached";
fi
wget in genere rinominerà i file con un nome file.html.1, .2, ecc., quindi è possibile utilizzare l'array associativo per memorizzare un elenco di quale è stato scaricato e quale sia stato il nome file effettivo.