Renommer plusieurs fichiers en utilisant le script Bash

Je veux renommer plusieurs fichiers dans le même répertoire en utilisant le script Bash. Les noms des fichiers sont les suivants:

file2602201409853.p file0901201437404.p file0901201438761.p file1003201410069.p file2602201410180.p 

Je souhaite renommer au format suivant:

file2503201409853.p file2503201437404.p file2503201438761.p file2503201410069.p file2503201410180.p 

Jétais en train de lire à propos de la commande renommer, et jessaie de le faire de cette façon, mais cela ne fait rien, je pense que jai des questions sur la syntaxe. Ensuite, jai lu que vous pouvez faire une boucle en utilisant la commande mv comme suit:

for file in cmpsms*2014*.p; do mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}" done 

Mais je ne peux pas renommer les fichiers. Quest-ce que je fais mal?

Commentaires

  • duplication possible de Comment puis-je renommer beaucoup des fichiers utilisant une expression régulière?
  • Vous pouvez ' avoir une expression de modèle sur le côté droit dune expression de remplacement dexpansion de paramètre. À quoi vous attendiez-vous où se trouve *?
  • @Kiwy Cette question concerne la suppression dune partie du nom de fichier. Ergo, très douteux en double.
  • La prochaine fois, veuillez décrire les changements de nom de fichier que vous voulez faire (jai dû regarder cela pendant un bon moment avant de voir les différences et les similitudes). Les exemples sont bons, mais une description ainsi que des exemples est encore meilleure.

Réponse

Vous aviez raison denvisager dabord de renommer. La syntaxe est un peu étrange si vous « nêtes pas habitué aux expressions régulières, mais cest de loin la route la plus rapide / la plus courte une fois que vous savez ce que vous » faites:

rename "s/\d{4}/2503/" file* 

Cela correspond simplement aux 4 premiers nombres et les échange avec ceux que vous avez spécifiés.

Et un faisceau de test (-vn signifie être verbeux mais ne « t faire nimporte quoi) en utilisant vos noms de fichiers:

$ rename "s/\d{4}/2503/" file* -vn file0901201437404.p renamed as file2503201437404.p file0901201438761.p renamed as file2503201438761.p file1003201410069.p renamed as file2503201410069.p file2602201409853.p renamed as file2503201409853.p file2602201410180.p renamed as file2503201410180.p 

Commentaires

  • Remarque quil sagit du renommage Perl sur Debian et ses dérivés (Ubuntu, Mint,…). Sur les autres distributions Linux, rename est un outil de changement de nom de fichier complètement différent (que Debian fournit sous le nom de rename.ul).
  • Si votre distribution manque dun tel outil, regardez la réponse @Michael Campbell. Je pense que chaque distribution remplace la valeur par défaut rename comme la fait Debian.

Réponse

Cela devrait faire laffaire:

for f in file*; do mv $f ${f/${f:4:8}/25032014}; done 

Il remplace la chaîne entre le 4ème et le 12ème caractère par « 25032014 ».

Commentaires

  • ce for f in file*; do mv $f ${f/${f:4:4}/2503}; done fonctionne également.
  • Cela ' est sympa. Si vous voulez juste faire un mot normal pour remplacer un mot, cela fonctionne comme sed. par exemple. for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
  • @Eric – Jai posté votre réponse comme alternative car je pense quelle est ' plus claire et élégante . Si vous souhaitez également le publier en tant que réponse, je ' supprimerai le mien. Merci!
  • Pourquoi les guillemets doubles manquants ?
  • Cela me donne une erreur: " mv: target ' FILE_NAME ' nest pas un répertoire "

Réponse

cest vraiment la réponse de @Eric den haut – mais cest une réponse élégante donc Je la republie comme une bonne réponse pour attirer davantage lattention sur elle.

for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done 

Réponse

ptrn="file[0-9][0-9][0-9][0-9]2014[0-9][0-9][0-9][0-9][0-9].p" path=/dir ( set -- "${path}/"${ptrn} ; for f ; do { echo "mv ${path}/${f} \ ${path}/file25032014${f#2014}" } ; done ) 

Cela devrait faire laffaire. Remarque – Je » nai pas lhabitude de transmettre des commandes mass mv – comme il est écrit, cest juste un écho. Vous  » Vous devrez régler cela avant que cela ne fonctionne.

Réponse

Une manière native simple de le faire sans boucle, avec traversée des répertoires :

find -type f | xargs -I {} mv {} {}.txt 

Il renomme tous les fichier en place.

Et ci-dessous une œuvre exemple avec parallélisation :

find -name "file*.p" | parallel "f="{}" ; mv -- {} ${f:0:4}2503${f:8}" 

Commentaires

  • Cétait une première approche simple pour imaginer une meilleure solution. Si vous voulez une commande fonctionnelle, procédez comme suit:
  • find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'

Réponse

Si vous trouvez que vous faites souvent ce genre de choses, cherchez « rename.pl ». Cest un script perl, mais vous permet simplement de lui donner du code perl (comme /// expression), et il effectuera un changement de nom en masse basé sur cette expression ou ce code.

Il existe une version de base ici: http://stackoverflow.org/wiki/Rename.pl mais il existe dautres versions flottant sur le net. Il existe depuis des âges, des âges et des âges.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *