Déplacer / Renommer beaucoup de fichiers avec une taille de fichier spécifique

4

J'ai récupéré beaucoup d'images (plus de 1000) d'une mauvaise carte SD. Tous sauf 75 qui semble être «cassé». J'ai lancé un programme pour que toutes les images soient lues à un niveau inférieur et j'ai découvert que j'avais toutes les images, y compris celles qui ne sont pas lisibles sur la carte SD. .

Je veux trouver le fichier (s'il y en a plus d'un, récupérez simplement le premier) dans le bon dossier avec exactement la même taille que chaque fichier du dossier «mauvais» et le renommer avec son nom. / p>

J'ai exécuté cette commande ls -lR | egrep -v '^d' | awk '==5040057{print}'

et j'ai eu ce résultat

-rw-r--r-- 1 user user  5040057 Apr  6 04:47 _MG_2443.JPG
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f11146176.jpg
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f12072256.jpg
-rw-r--r-- 1 user user 5040057 Apr  6 04:47 f14834560.jpg

Modifier: il n'apparaît pas dans le résultat de la commande, mais la structure du dossier est la suivante:

Recovery:
 |- Bad ( containing _MG_XXXX.JPG files )
 |- Good ( Containing fXXXXXXXX.jpg files )

Où la première image _IMG_2443.JPG est la mauvaise image et les éléments suivants sont bons (ce sont les candidats à renommer ou à déplacer). Donc, pour l'exemple précédent, je voudrais par exemple que le fichier 'f11146176.jpg' soit renommé dans le dossier Good en tant que '_MG_2443.JPG' afin que je puisse le vérifier plus tard et le remplacer dans le dossier incorrect.

Existe-t-il un moyen d'exécuter une commande pour le faire automatiquement pour toutes les images? Merci

    
posée SERPRO 06.05.2014 - 12:52
la source

1 réponse

3

La taille du fichier n'est pas un bon moyen de déterminer les doublons. Vous pouvez avoir deux fichiers avec exactement la même taille mais des contenus différents. Cela signifie qu'il est fort probable que cette approche échouera. Cela dit, ce qui suit fera ce que vous avez demandé.

Important: cela suppose que vos noms de fichiers n’ont pas d’espaces ni de nouvelles lignes.

find bad -iname "*.jpg" -printf "%s %f\n" | while read -r bs bf; do 
  find good/ -iname "*.jpg" -printf "%s %f\n" | while read -r gs gf; do 
    [ $bs -eq $gs ] && echo "mv good/$gf good/$bf"; 
  done 
done

Explication

  • find bad -iname "*.jpg" -printf "%s %f\n" : trouve tous les fichiers dont le nom se termine par .jpg ou .JPG dans le répertoire bad et imprime leur taille et nom de fichier.
  • while read -r bs bf; do : lit chaque ligne de la sortie ci-dessus, en enregistrant la taille du fichier sous la forme $bs et son nom sous la forme $bf .
  • Le second find ... | while ...; done fait exactement la même chose pour le répertoire good , en enregistrant la taille du fichier sous la forme $gs et son nom sous la forme $gf .
  • [[ $bs -eq $gs ]] && echo "mv good/$gf good/$bf"; : Si la taille du mauvais fichier est la même que celle du bon fichier, renommez le bon fichier en utilisant le nom du mauvais fichier. Si cela correspond à vos attentes, supprimez l'écho et remplacez la ligne par mv good/"$gf" good/"$bf" . Notez que cela conservera le nom de fichier last "bad" comme nom final du fichier "good".

Je tiens à souligner que ce n'est pas sûr, différents fichiers peuvent avoir exactement la même taille et des contenus complètement différents. Au lieu d'utiliser cette approche naïve, il serait peut-être préférable d'utiliser un programme spécialement conçu pour comparer des images. Je n'ai jamais utilisé de logiciel de ce type, mais une recherche de 3 minutes est apparue DupeGuru . Je vous suggère de l'essayer d'abord:

  

DupeGuru : dupeGuru Picture Edition (PE en abrégé) est un outil permettant de rechercher des images en double sur votre ordinateur. dupeGuru PE est un grand frère de dupeGuru.

     

Ce logiciel fonctionne comme dupeGuru, mais est spécialisé pour la correspondance des images en double. dupeGuru PE fonctionne sous Windows, Mac OS X et Linux.

    
réponse donnée terdon 06.05.2014 - 14:13
la source

Lire d'autres questions sur les étiquettes