2009-10-21 5 views
10

Je construis un petit outil qui téléchargera des fichiers en utilisant wget, en lisant les URL de différents fichiers. La même URL peut être présente dans différents fichiers; l'URL peut même être présente dans un fichier plusieurs fois. Il serait inefficace de télécharger une page plusieurs fois (chaque fois que son URL se trouve dans la liste). Ainsi, l'approche simple est de sauvegarder le fichier téléchargé et de demander à ne pas le télécharger à nouveau s'il est déjà là.Comment calculer un hachage pour une chaîne (url) dans bash pour la mise en cache de wget

Ce serait très simple; cependant les urls sont très longs (beaucoup de paramètres GET) et ne peuvent donc pas être utilisés comme tels pour les noms de fichiers (wget donne l'erreur 'Impossible d'écrire sur ... [] nom de fichier trop long'). Donc, j'ai besoin de renommer les fichiers téléchargés. Pour que le mécanisme de mise en cache fonctionne, le schéma de renommage doit implémenter "one url < => un nom": si une URL donnée peut avoir plusieurs noms, la mise en cache ne fonctionne pas (ie, je numérote simplement les fichiers dans l'ordre ils sont trouvés, je ne laisserai pas wget identifier quelles urls ont déjà été téléchargées).

Le système de changement de nom le plus simple serait de calculer un hachage md5 du nom du fichier (et non du fichier lui-même, qui est ce que md5sum fait); cela garantirait que le nom de fichier est unique et qu'une URL donnée donne toujours le même nom.

Il est possible de le faire en Perl, etc., mais cela peut-il être fait directement dans bash ou en utilisant un utilitaire système (RedHat)?

Répondre

24

Ressemble à l'utilitaire système md5sum.

URLMD5=`/bin/echo $URL | /usr/bin/md5sum | /bin/cut -f1 -d" "` 

Si vous voulez créer seulement le hachage sur le nom de fichier, vous pouvez obtenir ce rapidement sed:

FILENAME=`echo $URL | /bin/sed -e 's#.*/##'` 
URLMD5=`/bin/echo $FILENAME | /usr/bin/md5sum | /bin/cut -f1 -d" "` 
+0

Eh bien merci beaucoup pour la réponse rapide; Je n'avais pas réalisé que je pouvais simplement utiliser md5sum de cette façon! Je ne comprends pas ce que vous dites au sujet du « nom » si: quand on calcule la clé md5, il n'y a pas encore ... les noms de fichiers? – Bambax

+0

@bambax: Epsilon Prime fait référence à la partie du nom de fichier de l'URL, par exemple: "index.html". La commande 'sed' supprime tout jusqu'à et y compris la dernière barre oblique. –

+0

@Dennis: Ok, merci; mais dans ce cas, je ne veux certainement pas simplement utiliser la partie du nom de fichier de l'URL, car différents ensembles de paramètres GET devraient entraîner la mise en cache/extraction de différents fichiers. – Bambax

1

versions plus récentes de Bash fournissent un tableau associatif, ainsi qu'un tableau indexé. Quelque chose comme cela pourrait fonctionner pour vous:

declare -A myarray 
myarray["url1"]="url1_content" 
myarray["url2"]="" 

if [ ! -z ${myarray["url1"]} ] ; then 
    echo "Cached"; 
fi 

wget renomme généralement les fichiers avec un filename.html.1, .2, etc., vous pouvez donc utiliser le tableau associatif pour stocker une liste dont l'un a été téléchargé et ce que le nom de fichier était.

8

Je n'ai pas le représentant pour commenter la réponse, mais il y a une clarification à la réponse d'Epsilon Prime: par défaut, echo imprimera une nouvelle ligne à la fin du texte. Si vous voulez que les sommes md5 pour correspondre avec ce qui sera généré par tout autre outil (par exemple php, le md5 de Java, etc.), vous devez appeler

echo -n "$url" 

qui supprimera la nouvelle ligne.

+0

C'est une chose vraiment bizarre à faire. Je suis heureux que je sache maintenant à ce sujet. – buildsucceeded

3

Autres options sur mon Ubuntu (précise): boîte

  • echo -n $STRING | sha512sum
  • echo -n $STRING | sha256sum
  • echo -n $STRING | sha224sum
  • echo -n $STRING | sha384sum
  • echo -n $STRING | sha1sum
  • echo -n $STRING | shasum

Autres options sur mon Mac:

  • echo -n $STRING | shasum -a 512
  • echo -n $STRING | shasum -a 256
  • etc.
Questions connexes