Renommez tous les fichiers d’un dossier avec un préfixe dans une seule commande Unix

Renommez tous les fichiers dans un dossier avec le préfixe “Unix_”, c’est-à-dire supposons qu’un dossier a deux fichiers a.txt et b.pdf, ils doivent tous deux être renommés d’une seule commande en Unix_a.txt et Unix_b.pdf

Si vos noms de fichiers ne contiennent aucun espace blanc et que vous ne possédez aucun sous-répertoire, vous pouvez utiliser une boucle simple for :

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

Sinon, utilisez la commande de rename commode (qui est un script perl) – même si elle n’est pas disponible sur chaque Unix (par exemple, OS X n’a pas de rename ).

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

  • Renommer facilement plusieurs fichiers

Si vos noms de fichiers contiennent des espaces, il est plus facile d’utiliser 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’existe -printf pas d’option -printf . Mais GNU findutils devrait être installable (par exemple sur Mac OS X avec brew install findutils ).

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

Essayez la commande rename dans le dossier contenant les fichiers :

 rename 's/^/Unix_/' * 

L’argument de rename ( commande sed ) indique de remplacer le regex ^ par Unix_ . Le caret (^) est un caractère spécial qui signifie début de ligne .

Je pense que c’est exactement ce que vous recherchez:

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

Oui, c’est simple, élégant et puissant, et alos oneline-comand de courese. Vous pouvez obtenir une introduction plus détaillée sur la page: Renommer les fichiers et les répertoires (Ajouter un préfixe)

J’ai récemment fait face à la même situation et trouvé une solution intégrée plus facile. Je le partage ici pour que cela aide d’autres personnes à la recherche de solutions.

Avec OS X Yosemite, Apple a intégré les fonctionnalités de changement de nom de lot directement dans 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 cliquez sur l’un d’eux en maintenant la touche Contrôle enfoncée.

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

  3. Dans le menu local situé sous Renommer les éléments du dossier, choisissez de remplacer le texte dans les noms, d’append du texte aux noms ou de modifier le format du nom.

    • Remplacer le texte: Entrez le texte que vous souhaitez supprimer dans le champ Rechercher, puis entrez le texte que vous souhaitez append dans le champ “Remplacer par”.

    • Ajouter du texte: entrez le texte que vous souhaitez append dans le champ, puis choisissez d’append le texte avant ou après le nom actuel.

    • Format: Choisissez un format de nom pour les fichiers, puis choisissez d’indiquer 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 que vous souhaitez utiliser.

  4. Cliquez sur Renommer.

Si vous avez un modèle commun dans vos fichiers, vous pouvez utiliser Remplacer le texte, sinon Ajouter du texte ferait également le travail.

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

 ls | xargs -i mv {} unix_{} 

Cela fonctionne également parfaitement.

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

Utiliser awk:

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

Fonctionne également pour les éléments avec des espaces et ignore les répertoires

 for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done 

Avec rnm (vous devrez l’installer):

 rnm -ns 'Unix_/fn/' * 

Ou

 rnm -rs '/^/Unix_/' * 

PS: je suis l’auteur de cet outil.

Situation:

Nous avons certificatee.key certificatee.crt dans /user/ssl/

Nous voulons renommer tout ce qui commence par un certificatee à certificatee_OLD

Nous sums maintenant situés à l’intérieur /user

Tout d’abord, vous faites une course à sec avec -n :

rename -n "s/certificatee/certificatee_old/" ./ssl/*

Qui retourne:

rename(./ssl/certificatee.crt, ./ssl/certificatee_OLD.crt) rename(./ssl/certificatee.key, ./ssl/certificatee_OLD.key)

Vos fichiers restront inchangés. Il ne s’agit que d’un test.

Solution:

Lorsque vous êtes satisfait du résultat du test, lancez-le pour de vrai:

rename "s/certificatee/certificatee_OLD/" ./ssl/*

Ce que cela veut dire:

`rename” s / SOMETHING / SOMETING_ELSE “CHEMIN / FICHIERS

Pointe:

Si vous êtes déjà sur le chemin, lancez-le comme ceci:

rename "s/certificatee/certificatee_OLD/" *

Ou si vous voulez faire cela dans n’importe quel sous-répertoire commençant par ss do:

rename -n "s/certificate/certificatee_old/" ./ss*/*

Vous pouvez aussi faire:

rename -n "s/certi*/certificatee_old/" ./ss*/*

Qui renomme tout en commençant par certi dans n’importe quel sous-répertoire commençant par ss .

Le ciel est la limite.

Jouez avec regex et testez TOUJOURS ceci AVANT avec -n .

REGARDEZ CE CELA RENOMMERA MÊME LES NOMS DES DOSSIERS QUI CORRESPONDENT. Mieux cd dans le répertoire et le faire là-bas. UTILISEZ À PROPRE RISQUE.