Envisagez le scénario suivant, déjà survenu à quelques reprises au sein de notre société : nous avons besoin de traduire un site Web qui a beaucoup de fichiers, chacun d’entre eux dénommé « index.html » niché à différents niveaux dans leur propre dossier.
Il m’a était précisé qu’il s’agissait d’une situation cauchemardesque à gérer avec des n’acceptent que des fichiers uniques pour la traduction, étant donné que par la suite il est très difficile de faire correspondre les fichiers traduits avec chaque source.

Une idée qui fonctionne bien est de renommer chaque fichier avec le chemin complet de la structure du répertoire. Ceci garantit un nom unique, et en même temps cela maintient l’emplacement du fichier à l’intérieur de cette structure.

Par exemple :

Mettons que nous avons deux fichiers :

site/main/index.html

site/deeply/nested/folder/index.html

Nous pouvons par la suite les renommer :

site_main_index.html

site_deeply_nested_folder_index.html

Après les avoir traduit, le fait de replacer le caractère séparateur de dossiers (« / » sous ) restaurera le nom original et la structure des dossiers.

Ce cas particulier fonctionne bien car le caractère utilisé pour remplacer « / » n’apparaît pas dans les noms des fichiers. Pour les situations de la vie réelle je choisis habituellement «__», qui est une combinaison très rare de caractères (même si elle échoue si le nom de dossier se termine par « _ »), mais n’importe quel caractère ou combinaison d’entre eux qui ne figurent pas sur les noms fonctionnera.

À ce stade, je peux entendre la clameur des masses rugissant vous ne pouvez pas le faire pour des dizaines de fichiers, cela prendra une éternité ! Eh bien, j’ai juste eu à le faire pour 150 dossiers, et il ne m’a fallu que quelques secondes.

Voici ce que j’ai utilisé:

mkdir for_translation

find * -iname \*.html > /tmp/files.txt

while read x; do cp "$x"  for_translation/"${x//\//__}"; done < /tmp/files.txt

Une fois les fichiers traduits, le retour de conversion peut être réalisé sous cette forme :

ls > /tmp/files.txt

while read x; do full_name=${x//__/\/}; dir=$(dirname $full_name);\

mkdir -p "$dir"; mv "$x" "$full_name"; done < /tmp/files.txt

Plus facile à faire qu’à dire !
Une explication rapide. La redirection dans un fichier temporaire s’adresse à la possibilité que les fichiers ou dossiers peuvent contenir des espaces, des virgules ou d’autres caractères indisciplinés dans leurs noms. Les guillemets (« ) ont le même objectif. La copie (cp) peut être remplacée par un mouvement (mv) si on le souhaite (avec la copie nous conservons les originaux, juste au cas où). L’essentiel se fait à l’intérieur d’accolades ({}), mais afin de trouver les informations vous devrez consulter un tutoriel plus avancé sur le sujet.
L’assistant Unix  trouvera ces méthodes triviales, mais je pense qu’elles fonctionnent bien, et elles sont facilement accessibles à toute personne ayant accès à un système de type Unix (Linux, et en particulier Ubuntu qui semble être le plus populaire des distributions Linux).

Version en anglais : http://translation-blog.trustedtranslations.com/renaming-files-for-website-translations-2012-09-04.html

Associé aux mots :