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
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 derename.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.
*
?