Comment calculer un hachage pour une chaîne (url) en bash pour la mise en cache wget

StackOverflow https://stackoverflow.com/questions/1602378

  •  05-07-2019
  •  | 
  •  

Question

Je construis un petit outil qui téléchargera des fichiers en utilisant wget, en lisant les URL à partir de différents fichiers. La même URL peut être présente dans différents fichiers; l'URL peut même être présent dans un fichier plusieurs fois. Il serait inefficace de télécharger une page plusieurs fois (chaque fois que son URL est trouvée dans la liste).

Ainsi, l’approche simple consiste à enregistrer le fichier téléchargé et à demander à wget de ne pas le télécharger à nouveau s’il se trouve déjà à cet emplacement.

Ce serait très simple. Cependant, les URL sont très longues (beaucoup de paramètres GET) et ne peuvent donc pas être utilisées telles quelles pour les noms de fichiers (wget donne l'erreur "Impossible d'écrire dans ... nom de fichier trop long []").

Donc, je dois renommer les fichiers téléchargés. Mais pour que le mécanisme de mise en cache fonctionne, le schéma de changement de nom doit implémenter & "; Une URL & Lt; = & Gt; un nom " ;: si une URL donnée peut avoir plusieurs noms, la mise en cache ne fonctionne pas (si je numérote simplement les fichiers dans l'ordre dans lequel ils ont été trouvés, je ne laisserai pas wget identifier les URL qui ont déjà été utilisées. téléchargé).

Le schéma de renommage le plus simple consisterait à calculer un hachage md5 du nom de fichier (et pas du fichier lui-même, comme le fait md5sum); 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 faire cela en Perl, etc., mais peut-on le faire directement en bash ou en utilisant un utilitaire système (RedHat)?

Était-ce utile?

La solution

On dirait que vous voulez utiliser l'utilitaire système md5sum.

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

Si vous voulez créer uniquement le hachage sur le nom du fichier, vous pouvez l'obtenir rapidement avec sed:

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

Notez que, selon votre distribution, le chemin d'accès à cut peut être /usr/bin/cut.

Autres conseils

Je n'ai pas le représentant à commenter la réponse, mais une réponse à la réponse d'Epsilon Prime est nécessaire: par défaut, echo imprimera une nouvelle ligne à la fin du texte. Si vous souhaitez que les sommes md5 correspondent à celles générées par tout autre outil (php, md5 de Java, etc.), vous devez appeler

.
echo -n "$url"

qui supprimera la nouvelle ligne.

Autres options de ma boîte 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

Autres options sur mon Mac:

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

Les versions les 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 renommera généralement les fichiers avec un nom de fichier.html.1, .2, etc., afin que vous puissiez utiliser le tableau associatif pour stocker une liste des fichiers téléchargés et le nom du fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top