2
votes

Comment renommer plusieurs fichiers avec des noms différents à la fois?

J'ai plusieurs fichiers docx (environ 250 fichiers) chacun avec un nom différent. Je dois renommer tous ces fichiers afin que le résultat soit que chaque nom de fichier doit être un numéro consécutif pour le fichier précédent, comme suit:

1.docx - 2.docx - 3.docx - etc.

Comment puis-je faire cela en utilisant la ligne de commande de mon Linux?

Mon plus gros problème est que chaque fichier a un nom complètement illisible.

Par exemple:

ÄÿÇä ÄùàÄàÜ ÄæÆë ÜÖÆà.docx

Comme ces fichiers ont été nommés à l'origine en hébreu et lorsque le fichier zip a été extrait, les fichiers ont reçu des noms illisibles.


3 Réponses :


1
votes

Essayez :

count=0; for f in *.docx; do mv -i -- "$f" "some/other/dir/$((count=count+1)).docx"; done

S'il y avait une chance que l'un des fichiers d'origine ait été nommé avec un simple numéro, comme 3.docx , alors c'est plus sûr de déplacer les fichiers vers un autre répertoire en même temps qu'ils sont renommés:

count=0; for f in *.docx; do mv -i -- "$f" "$((count=count+1)).docx"; done

Comment ça marche

  • count=0

    Ceci initialise la variable count à zéro.

  • pour f dans * .docx; faire

    Cela démarre une boucle avec f étant assigné au nom de chaque fichier docx à son tour.

  • mv -i - "$ f" "un / autre / dir / $ ((count = count + 1)). docx"

    Cela renomme / déplace les fichiers. $ ((count = count + 1)) indique au shell d'incrémenter le count à chaque fois.

    Sous bash, $ ((count = count + 1)) peut être simplifié en $ ((++ count)) .

    li >
  • fait

    Cela signale la fin de la boucle.


4 commentaires

Mieux vaut echo mv ... ... dans un fichier > renames.sh . Vérifiez que ceux-ci sont bons, puis . ./renames pour les exécuter. Si un désordre est fait de ce genre de chose, il est difficile de le défaire. mv supprime les fichiers de destination; si votre code génère le même nom deux fois d'une manière ou d'une autre, vous pouvez perdre un fichier.


Par exemple. et si nous déposons ce code dans un shell qui ne reconnaît pas l'opérateur ++ .


@Kaz C'est un très bon point. J'ai ajouté -i à la commande mv afin que le problème devienne immédiatement apparent avant l'écrasement des fichiers. (Ma préoccupation avec echo mv ...> a.sh et . A.sh est que cela pourrait entraîner des problèmes si un nom de fichier contenait " ou d'autres caractères actifs sur le shell.)


Ouais; ne pas faire écho à un fichier et exécuter des commandes à moins que vous ne sachiez vraiment ce que vous faites; mais echo juste pour passer en revue les commandes avant de supprimer echo pour enfin les exécuter est une bonne idée.



1
votes

Cela pourrait fonctionner pour vous (GNU parallèle):

parallel --dry-run mv -v ::: *.docx :::+ {1..300}.docx

Cela affichera des commandes pour renommer tous les fichiers se terminant par .docx en nombres consécutifs jusqu'à 300 inclus .

Pour exécuter réellement les commandes (après inspection), supprimez l'option --dry-run .


4 commentaires

Merci beaucoup potong d'avoir révélé la solution rapidement, cette commande fonctionne vraiment. Cependant, pour une raison quelconque, les 10 derniers fichiers continuent avec le nom d'origine. Saurez-vous pourquoi?


Peut-être parce que vous avez 310 fichiers .docx ? Vous pouvez changer le deuxième argument de fichier en {1..1000} .docx pour couvrir jusqu'à 1000 fichiers, mais le premier argument de fichier limitera le changement de nom à ces fichiers uniquement.


Non, en fait, le script a bien fonctionné jusqu'en 231 et en a laissé 10 avec le nom d'origine. J'ai également découvert que je devais convertir tous ces fichiers en texte (.txt), mais je n'ai pas pu trouver de solution pour le faire avec un bash. Savez-vous comment le résoudre?


Je ne peux que vous suggérer d'inspecter les commandes créées par l'option --dry-run .



1
votes

Cela pourrait fonctionner:

parallel mv -- {} {#}.docx ::: *.docx


0 commentaires