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)?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top