Nom de file unique pour différents files

Je travaille avec le graphisme. J'ai téléchargé de nombreux files (files EPS files PSD , etc) à partir de différents sites Web.

Parce que cela vient de différents sites Web, après avoir téléchargé de plus de 10 sites différents, j'ai eu plusieurs files de même taille, et même tout autre nom de file (2 à 4 copys pour le même file). Supprimer la duplication manuellement en l'ouvrant un par un prend beaucoup de time

J'espère qu'il y a un moyen de renommer tous les files téléchargés pour être un nom unique pour différents files (cela ne me dérange pas si le nouveau nom n'est pas descriptif).

Par exemple, 2 même file: file nice-sun.eps téléchargé à partir du site 1, tandis que 678.eps téléchargé à partir du site 2. Il deviendra le même nom de file après avoir été renommé.

Cette command renommera tous les files dans le md5sum de leur contenu. Cela signifie que les files avec le même contenu auront le même nom.

 for f in *; do mv $f $(md5sum $f | cut -d " " -f 1); done 

Vous pouvez replace md5sum par sha1sum dans la command.

Vous pouvez également exécuter cette command en toute security dans un directory où certains files ont un nom de file unifié alors que d'autres ne l'ont pas fait.

Pour cette démonstration, j'ai ajouté -v à mv afin que nous puissions voir ce qui est renommé.

 $ echo 1 > a $ echo 2 > b $ echo 1 > c $ ls -1 a b c $ for f in *; do mv -v $f $(md5sum $f | cut -d " " -f 1); done `a' -> `b026324c6904b2a9cb4b88d6d61c81d1' `b' -> `26ab0db90d72e28ad0ba1e22ee510510' `c' -> `b026324c6904b2a9cb4b88d6d61c81d1' $ echo 1 > d $ echo 2 > e $ ls -1 26ab0db90d72e28ad0ba1e22ee510510 b026324c6904b2a9cb4b88d6d61c81d1 d e $ for f in *; do mv -v $f $(md5sum $f | cut -d " " -f 1); done mv: `26ab0db90d72e28ad0ba1e22ee510510' and `26ab0db90d72e28ad0ba1e22ee510510' are the same file mv: `b026324c6904b2a9cb4b88d6d61c81d1' and `b026324c6904b2a9cb4b88d6d61c81d1' are the same file `d' -> `b026324c6904b2a9cb4b88d6d61c81d1' `e' -> `26ab0db90d72e28ad0ba1e22ee510510' $ ls -1 26ab0db90d72e28ad0ba1e22ee510510 b026324c6904b2a9cb4b88d6d61c81d1 

C'est le script rename-hash que j'utilise pour renommer les files en hashsum, en gardant l'extension inchangée. Prend une list de files à renommer en tant que parameters. Utilisez -n comme premier paramètre pour la course à sec.

 #!/bin/sh unset DRY [ "$1" == "-n" ] && { DRY=1; shift; } for i in $@; do if [ -f "$i" ]; then HASHSUM=$(md5sum "$i" | sed 's/\(..........\).*/\1/') DIR=$(dirname "$i") BASE=$(basename "$i") EXT=$(echo "$BASE" | sed -n 's/[^.]*\(\..*\)/\1/p') TARGET="$DIR"/"$HASHSUM""$EXT" if [ "$TARGET" != "$DIR/$BASE" ]; then if [ -n "$DRY" ]; then echo will rename "$i" to "$TARGET" else mv "$i" "$TARGET" fi fi fi done 

Exemple:

 $ rename-hash -n * will rename test.pdf to ./f604d0d6ad.pdf will rename images.tar.gz to ./d41d8cd91b.tar.gz 

Il existe des utilitaires pour find des duplicates. Vous pouvez utiliser find et md5sum, mais cela peut prendre du time.

J'utilise habituellement fdupes pour ça. Si vous pouvez find tous les duplicates et sortir leurs noms à stdout. Après cela, vous pouvez parsingr la sortie et renommer tous les files comme vous le souhaitez ou même les supprimer.