96 votes

Renommer tous les fichiers d'un dossier avec un préfixe en une seule commande

Renommer tous les fichiers d'un dossier avec le préfixe "Unix_"

Supposons qu'un dossier contienne deux fichiers

a.txt
b.pdf

alors ils devraient tous deux être renommés d'une commande unique en

Unix_a.txt
Unix_b.pdf

1 votes

Vérifiez ce lien => cyberciti.biz/tips/

0 votes

116voto

miku Points 63392

Si vos noms de fichiers contiennent pas d'espace blanc et que vous n'avez pas de sous-répertoires, vous pouvez utiliser un simple for boucle :

$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 

Sinon, utilisez la fonction pratique rename (qui est un script perl) - bien qu'elle ne soit pas toujours disponible sur tous les Unix (par exemple, OS X n'est pas livré avec la commande rename ).

Un bref aperçu sur debian-administration.org :

Si vos noms de fichiers contiennent des espaces, il est plus facile d'utiliser la fonction find sous Linux, ce qui suit devrait fonctionner :

$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh

Sur les systèmes BSD, il n'y a pas de -printf option, malheureusement. Mais GNU findutils doit pouvoir être installé (par exemple sur Mac OS X avec brew install findutils ).

$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh

0 votes

@Matteo : Merci pour l'indication : j'ai mis à jour ma réponse avec un avertissement et deux exemples avec find .

0 votes

Je recommande également for f in *; do [[ -f ${f} ]] && mv ...; done pour attraper uniquement les fichiers (pas de sous-répertoires, de liens, etc.)...

1 votes

Si vous citez les variables comme vous le devriez, alors for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done fonctionne correctement, quels que soient les caractères présents dans les noms de fichiers. Il déplace également les répertoires, les sockets, les liens symboliques et d'autres types de fichiers ; je suppose que cela n'a pas d'importance.

82voto

pavium Points 7845

Essayez le rename commande dans le dossier contenant les fichiers :

rename 's/^/Unix_/' *

L'argument de rename ( commande sed s ) indique qu'il faut remplacer la regex ^ avec Unix_ . Le caret (^) est un caractère spécial qui signifie début de la ligne .

10 votes

Pouvez-vous expliquer ce que 's/^/.../' signifie ?

0 votes

@Matteo 's/^/.../' est l'argument de l'expression perl pour la fonction commande de renommage

0 votes

C'est génial ! Je suggère d'ajouter le dossier/*, car * est un peu dangereux si la commande est accidentellement répétée à un autre endroit.

45voto

Zheng Qsin Points 240

Je pense que c'est exactement ce que vous cherchez :

ls | xargs -I {} mv {} Unix_{}

Oui, c'est un logiciel simple, mais élégant et puissant, et qui se lit d'une traite. Vous pouvez obtenir une introduction plus détaillée de ma part sur la page : Renommer des fichiers et des répertoires (ajouter un préfixe)

3 votes

Attention à ne pas traiter la sortie de ls - cela peut entraîner des problèmes s'il y a des espaces ou d'autres caractères bizarres dans les noms de fichiers.

19voto

Tejas C Points 40

J'ai récemment été confronté à cette même situation et j'ai trouvé une solution intégrée plus facile. Je la partage ici afin qu'elle puisse aider d'autres personnes à la recherche d'une solution.

Avec OS X Yosemite, Apple a intégré les capacités de renommage par lots directement dans le Finder. Des informations détaillées sont disponibles ici . J'ai également copié les étapes ci-dessous,

Renommer plusieurs éléments

  1. Sélectionnez les éléments, puis Control-cliquez sur l'un d'entre eux.

  2. Dans le menu contextuel, sélectionnez Renommer les éléments.

  3. Dans le menu contextuel situé sous Renommer les éléments du dossier, choisissez de remplacer le texte des noms, d'ajouter du texte aux noms ou de modifier le format des noms.

    • Remplacer le texte : Saisissez le texte que vous souhaitez supprimer dans le champ "Rechercher", puis saisissez le texte que vous souhaitez ajouter dans le champ "Remplacer par".

    • Ajouter du texte : Saisissez le texte que vous souhaitez ajouter dans le champ, puis choisissez d'ajouter le texte avant ou après le nom actuel.

    • Format : Choisissez un format de nom pour les fichiers, puis choisissez de placer l'index, le compteur ou la date avant ou après le nom. Entrez un nom dans le champ Format personnalisé, puis entrez le numéro par lequel vous souhaitez commencer.

  4. Cliquez sur Renommer.

Si vous avez un modèle commun dans vos fichiers, vous pouvez utiliser l'option Remplacer le texte, sinon l'option Ajouter le texte fera également l'affaire.

2 votes

Excellent - j'ai gagné beaucoup de temps !

0 votes

Excellente solution pour les utilisateurs de Mac

7voto

NirajW Points 177

Vous pouvez simplement utiliser -i au lieu de -I {}

ls | xargs -i mv {} unix_{}

Cela fonctionne aussi parfaitement.

  • ls - liste tous les fichiers du répertoire
  • xargs - accepte tous les fichiers ligne par ligne en raison de la -i option
  • {} est le placeholder pour tous les fichiers, nécessaire si xargs reçoit plus de deux arguments en entrée

Utilisation de l'awk :

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

0 votes

-i est déprécié, maintenant c'est juste -I

0 votes

Cela m'a aidé sur Debian 8.Thaks

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X