Renommez les files en fonction de la sum de contrôle

J'ai une list md5sum et beaucoup de file que je voulais à la sum de contrôle et ensuite les renommer en fonction de la list md5sum.

Exemple de la list:

d4cd401ade018617629b39efed7b7be4 foo.bar 8fdb07ca55c164e0d5a69eff49fe800e bar.foo 8b167d01009f066aaf2d6c1ba336d842 foobar 

Maintenant, je voulais vérifier la sum de tous les files dans le directory courant, si la sum de contrôle sont appariés avec la list ci-dessus puis renommez-la comme colonne de droite.

Comment je peux faire ça?

Peut-être que cela pourrait aider. Je n'ai pas entièrement testé, c'est juste en théorie. Substituer si nécessaire:

 #! /bin/bash for II in * do if [ -f "$II" ]; then TMPV=$(md5sum "$II") MD="${TMPV%\ \ *}" TMPV=$(grep "$MD" hashes.txt) if [ ! -z "$TMPV" ]; then FN="${TMPV#*\ \ }" echo "Found: $II" echo "MD5 is: $MD" echo "Which matches $FN in hashes database" echo "Will Rename $II TO $FN" echo "" # CAREFUL, RENAME CMD: mv "$II" "$FN" fi; fi; done; 

Comme je l'ai dit, ne l'ai pas testé, mais il a semblé fonctionner sur ma boîte. J'espère que cela aide.

Tout d'abord, je ne vais pas prétendre que c'est la solution la plus profonde, mais voici une façon de le faire.

Disons que vous avez le file avec la sum de contrôle et les noms de files appelés filelist.txt alors vous pourriez utiliser quelque chose comme:

 while read -r checksum fname; do for f in file*; do if [[ $checksum == $(md5sum "$f" | cut -d' ' -f1) ]]; then mv "$f" "$fname"; fi ; done ; done < filelist.txt 

Mon idée:

  1. Au début, vous devez sortinger vos sums de contrôle connues: sort checksums.txt > sorted_checksums.txt
  2. Générer le file pour tous les files existants et les sortinger également: md5sum * | sort > real_checksums.txt md5sum * | sort > real_checksums.txt
  3. Joignez-vous à ces deux files et excluez les loggings avec les mêmes nouveaux et anciens noms: join -o "2.2 1.2" sorted_checksums.txt real_checksums.txt | awk '$1 != $2' > rename_pairs.txt join -o "2.2 1.2" sorted_checksums.txt real_checksums.txt | awk '$1 != $2' > rename_pairs.txt
  4. Renommer tous les files: cat rename_pairs.txt | xargs -L 1 echo mv cat rename_pairs.txt | xargs -L 1 echo mv (Supprimer l' echo de xargs pour renommer les files)

ATTENTION: cela ne fonctionnera que s'il n'y a pas d'espaces dans les noms de files. Vous pouvez utiliser awk 'NF != 2' sorted_checksums.txt real_checksums.txt pour vérifier que les lignes 3 et 4 doivent être utilisées.

Lisez les sums de contrôle dans un tableau associatif, parcourez les files et renommez-les si nécessaire. Placez les files renommés dans une arborescence de directorys séparée, en cas de chevauchement entre les nouveaux noms et les anciens noms.

 #!/bin/bash mkdir renamed typeset -A names while read -r sum name; do names[$sum]=$name done <list.md5sum for file in *; do if [[ -f $file ]]; then sum=$(md5sum <"$file"); sum=${sum%% *} if [[ -n ${names[$sum]} ]]; then mv -- "$file" "renamed/${names[$sum]}" fi fi done