Manière de déplacer des fichiers en bash et de renommer automatiquement le fichier copié sans écraser un fichier existant

Je procède à une restructuration majeure d’un grand nombre de répertoires avec des tonnes de jpgs, dont certains ont le même nom que les fichiers d’autres répertoires. Je veux déplacer / copier des fichiers dans des répertoires différents et les bash les renommera automatiquement si le nom correspond à un autre fichier dans ce répertoire (renommer IMG_238.jpg en IMG_238_COPY1.jpg , IMG_238_COPY2.jpg , etc.) au lieu de remplacer le fichier existant.

J’ai créé un script qui prend des fichiers JPEG et les déplace vers un nouveau répertoire basé sur des données exif. La dernière ligne du script qui déplace un jpg est: mv -n "$JPEGFILE" "$DIRNAME"

J’utilise l’option -n car je ne veux pas écraser les fichiers, mais je dois maintenant sortinger manuellement ceux qui n’ont pas été déplacés / copiés. Mon interface graphique le fait automatiquement … Existe-t-il un moyen relativement simple de le faire en bash?

(Au cas où cela importerait, j’utilise bash 3.2 dans Mac OSX Lion).

Cela devrait le faire

 # ssortingp path, if any fname="${JPEGFILE##*/}" [ -f "$DIRNAME/$fname" ] && { n=1 while [ -f "$DIRNAME/${fname%.*}_COPY${n}.${fname##*.}" ] ; do let n+=1 done mv "$JPEGFILE" "$DIRNAME/${fname%.*}_COPY${n}.${fname##*.}" } || mv "$JPEGFILE" "$DIRNAME" 

EDIT: Amélioré.

Vous pouvez essayer de télécharger et de voir si le rename basé sur Perl d’Ubuntu / Debian fonctionne. Il a une fonctionnalité de style sed . Quoique la page de manuel (sur mon système, mais le script doit être le même que celui lié):

“rename” renomme les noms de fichiers fournis en fonction de la règle spécifiée comme premier argument. L’argument perlexpr est une expression Perl susceptible de modifier la chaîne $ _ en Perl pour au moins certains des noms de fichiers spécifiés. Si un nom de fichier donné n’est pas modifié par l’expression, il ne sera pas renommé. Si aucun nom de fichier n’est donné sur la ligne de commande, les noms de fichiers seront lus via l’entrée standard.

Par exemple, pour renommer tous les fichiers correspondant à «* .bak» pour supprimer l’extension, vous pourriez dire:

  rename 's/\.bak$//' *.bak 

Pour traduire les noms de majuscules en bas, vous utiliseriez

  rename 'y/AZ/az/' *