Je veux renommer plusieurs fichiers dans le même répertoire à l'aide de scripts Bash. Les noms des fichiers sont les suivants:
file2602201409853.p
file0901201437404.p
file0901201438761.p
file1003201410069.p
file2602201410180.p
Je souhaite renommer le format suivant:
file2503201409853.p
file2503201437404.p
file2503201438761.p
file2503201410069.p
file2503201410180.p
Je lisais sur la commande renommer, et j'essaye de le faire de cette façon, mais ça ne fait rien, je pense que j'ai des questions sur la syntaxe. Ensuite, j'ai 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. Qu'est-ce que je fais mal?
*
?Réponses:
Vous aviez raison d'envisager de renommer en premier. La syntaxe est un peu étrange si vous n'êtes pas habitué aux expressions régulières, mais c'est de loin l'itinéraire le plus rapide / le plus court une fois que vous savez ce que vous faites:
Cela correspond simplement aux 4 premiers chiffres et les échange pour ceux que vous avez spécifiés.
Et un harnais de test (
-vn
signifie être verbeux mais ne faites rien) en utilisant vos noms de fichiers:la source
rename
est un outil de changement de nom de fichier complètement différent (sous lequel Debian est fournirename.ul
).rename
comme Debian.Cela devrait faire l'affaire:
Il remplace la chaîne entre le 4ème et le 12ème caractère par "25032014".
la source
for f in file*; do mv $f ${f/${f:4:4}/2503}; done
fonctionne aussi.for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
c'est vraiment la réponse d'Eric d'en haut - mais c'est une réponse élégante, donc je la republie comme une réponse appropriée pour attirer plus l'attention sur elle.
la source
Cela devrait faire l'affaire. Remarque - Je n'ai pas l'habitude de remettre des commandes mv de masse - comme écrit, ce n'est qu'un écho. Vous devrez trier cela avant que cela fonctionne.
la source
Une façon native simple de le faire sans boucle, avec traversée de répertoire :
Il renommera chaque fichier en place.
Et ci-dessous un exemple de travail avec parallélisation :
la source
find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'
Si vous constatez que vous faites souvent ce genre de choses, recherchez "rename.pl". C'est un script perl, mais vous permet simplement de lui donner du code perl (comme une expression ///), et il fera un renommage 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 d'autres versions flottant sur le net. Il existe depuis des siècles et des âges et des âges.
la source