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).
- La méthode
globde la classeDirliste tous les fichiers correspondant au motif placé en argument (ici, tous les fichiers en.txt) - Un bloc est utilisé avec la méthode
each, ce bloc est délimité par les accolades, la variablefprendra le nom d'un des fichiers à chaque itération. - La méthode
renamede la classeFileest utilisée pour renommer le fichier. - 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.