Script pour renommer les fichiers de caractères spéciaux et les répertoires

Je recherche un script pour renommer les fichiers et les répertoires contenant des caractères spéciaux. Mes dossiers:

?rip?ev <- Directory - Juhendid ?rip?evaks.doc <- Document - ?rip?ev 2 <- Subdirectory -- t?ts?.xml <- Subdirectory file 

Ils doivent être comme ça:

 ripev <- Directory - Juhendid ripevaks.doc <- Document - ripev 2 <- Subdirectory -- tts.xml <- Subdirectory file 

Je dois changer les fichiers et les dossiers pour que le type de fichier rest le même, par exemple .doc et .xml ne seront pas perdus. La dernière fois que je l’ai fait avec renommer il a perdu tous les types de fichiers et les fichiers ont été déplacés dans le répertoire mère dans ce cas? Le répertoire et les sous-répertoires rip? Ev étaient vides. Tout était situé dans le répertoire mère / home / samba / .

Donc, dans ce cas, il suffit de renommer le point d’interrogation dans le nom du fichier et le nom du répertoire, mais pas de le déplacer ailleurs ou de perdre un autre caractère ou le type de fichier. J’ai cherché autour de Google pour une réponse mais n’en ai pas trouvé un. Je sais que cela peut être fait avec find et rename, mais je n’ai pas pu surmonter la complexité du script. Quelqu’un peut-il m’aider s’il-vous-plaît?

Vous pouvez faire quelque chose comme ça

 find -name '*\?*' -exec bash -c 'echo mv -iv "$0" "${0//\?/}"' {} \; 

Notez l’ écho avant le mv pour que vous puissiez voir ce qu’il fait avant de changer quoi que ce soit. Sinon ci-dessus:

  • recherche ? dans le nom ( ? est équivalent à une seule version de caractère de * il faut donc y échapper)
  • exécute une commande bash en passant le {} comme premier argument (puisqu’il n’y a pas de nom de script, c’est $0 au lieu de $1 )
  • ${0//\?/} Effectue l’extension des parameters en bash en remplaçant toutes les occurrences de ? avec rien.

Notez également que les types de fichiers ne dépendent pas du nom sous linux, mais cela ne devrait changer aucune extension de fichier à moins qu’ils ne contiennent ? .

Aussi, cela va aussi renommer les liens symboliques s’ils contiennent ? (pas clair si oui ou non cela était attendu de la question).

Je fais habituellement ce genre de chose en Perl:

 #!/usr/bin/perl sub procdir { chdir @_[0]; for (<*>) { my $oldname = $_; rename($oldname, $_) if s/\?//g; procdir($_) if -d; } chdir ".."; } procdir("top_directory");