Renommer les fichiers qui composent un répertoire et souvent une galère à la main. J'ai un script qui me permet de le faire, mais je voulais voir si on pouvait le faire en une ligne de Ruby, la réponse est là :

ruby -e 'Dir.glob("*.txt").each{ |f| File.rename(f,f.gsub(/^(\d\d) /,%q[\1 - ]))}

L'option -e permet de faire exécuter la chaîne de caractères par l'interpréteur ruby. Pour éviter que bash n'interprète les instructions on les places entre apostrophes (ça permet de garder les guillemets pour la suite du programme).

  1. La méthode glob de la classe Dir liste tous les fichiers correspondant au motif placé en argument (ici, tous les fichiers en .txt)
  2. Un bloc est utilisé avec la méthode each, ce bloc est délimité par les accolades, la variable f prendra le nom d'un des fichiers à chaque itération.
  3. La méthode rename de la classe File est utilisée pour renommer le fichier.
  4. Le nouveau nom du fichier est construit à partir d'un expression régulière avec la méthode gsub. Les apostrophes ne pouvant pas être utilisés, on est obligé de passer par une notation %q[...]

Pour éviter de planter des fichiers, il est judicieux de tester la regexp avec un puts :

ruby -e 'Dir.glob("*.txt").each{ |f| puts f+"->"+f.gsub(/^(\d\d) /,%q[\1 - ])}'

edit du 13/11 glob peut être remplacé par [...]

ruby -e 'Dir["*.txt"].each{ |f| puts f+"->"+f.gsub(/^(\d\d) /,%q[\1 - ])}'

c'est valable pour le puts ou pour le File.rename.