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 :
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
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))
.
fait
Cela signale la fin de la boucle.
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 " code > 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.
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
.
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
.
Cela pourrait fonctionner:
parallel mv -- {} {#}.docx ::: *.docx
Copie possible de renommer en masse les fichiers dans les dossiers et sous-dossiers avec numéro séquentiel
stackoverflow.com/a/51369916/2836621