2 votes

Comment changer le nom de plusieurs répertoires ?

J'ai quelques répertoires dont je veux changer le nom en {00..16} .

$ ls
'FVSFT1092A'         'FVSFT1092I'
'FVSFT1092B'         'FVSFT1092J'
'FVSFT1092C'         'FVSFT1092K'
'FVSFT1092D'         'FVSFT1092L'
'FVSFT1092E'         'FVSFT1092M'
'FVSFT1092F'         'FVSFT1092N'
'FVSFT1092G'         'FVSFT1092O'
'FVSFT1092H'         'FVSFT1092P'

Existe-t-il une commande pour ce cas ?

2voto

Eliah Kagan Points 111731

Il existe peut-être de meilleures méthodes, mais c'est ainsi que je procéderais :

file-rename -n 's/.*/sprintf "%02d", ++our $i/e' FVSFT1092?

Si votre Shell vous dit que le file-rename n'existe pas, installez la commande rename paquet.

Si vous voulez remplacer uniquement les derniers caractères, plutôt que tout ce qui se trouve dans les noms originaux, vous pouvez utiliser ceci à la place :

file-rename -n 's/.$/sprintf "%02d", ++our $i/e' FVSFT1092?

Telles qu'elles sont écrites, ces commandes ne renomment aucun fichier. Lorsque le moment est venu de les renommer, supprimez la balise -n . Avant de retirer -n vous devriez inspecter la sortie. Il devrait montrer en quoi chaque fichier est renommé. Vous devez également vous assurer que seuls les fichiers que vous souhaitez réellement renommer, et non d'autres fichiers, sont listés. Pour la première commande montrée ci-dessus, le résultat devrait être le suivant :

rename(FVSFT1092A, 01)
rename(FVSFT1092B, 02)
rename(FVSFT1092C, 03)
rename(FVSFT1092D, 04)
rename(FVSFT1092E, 05)
rename(FVSFT1092F, 06)
rename(FVSFT1092G, 07)
rename(FVSFT1092H, 08)
rename(FVSFT1092I, 09)
rename(FVSFT1092J, 10)
rename(FVSFT1092K, 11)
rename(FVSFT1092L, 12)
rename(FVSFT1092M, 13)
rename(FVSFT1092N, 14)
rename(FVSFT1092O, 15)
rename(FVSFT1092P, 16)

L'exécuter sans -n renomme en fait les fichiers. Vous devriez presque toujours exécuter file-rename (et les commandes associées prename y rename ) avec -n d'abord pour faire un essai. Mais dans ce cas, c'est encore plus important que d'habitude, car le comportement de la commande peut être différent selon les paramètres de la locale ou si vous avez d'autres fichiers de nom similaire que vous ne voulez pas renommer.


La façon dont cette commande fonctionne est que le Shell expanse FVSFT1092? en une liste de tous les fichiers du répertoire courant dont le nom est FVSFT1092 suivi d'un caractère supplémentaire quelconque. Cette liste est transmise à la fonction file-rename qui modifie les noms en fonction (dans la première commande présentée ci-dessus) de l'expression Perl :

s/.*/sprintf "%02d", ++our $i/e

Cela renomme tout nom de fichier qui lui est passé au numéro le plus bas non encore utilisé, en commençant par 1 et le formate en deux chiffres, même s'il est inférieur à 10. Par conséquent, il dépend de l'ordre dans lequel les noms de fichiers sont fournis, qui à son tour dépend des fichiers qui existent réellement dans le répertoire courant et de l'ordre dans lequel le Shell les développe.

Cela devrait fonctionner. Dans certains cas étranges, cela ne fera pas ce que vous voulez, et il est facile de vérifier cela en exécutant la commande avec -n d'abord (comme indiqué ci-dessus), ce que vous devriez faire de toute façon pour éviter toute erreur.

Pour des informations générales sur la manière dont la syntaxe acceptée par le programme file-rename fonctionne, je recommande Renommer des fichiers en masse dans Ubuntu ; la plus brève des introductions à la commande rename (par Oli ).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X