OVH Cloud OVH Cloud

renommer un ensemble de fichier

6 réponses
Avatar
chmanu
Bonjour,

J'aimerais renomer l'ensemble des fichiers de ce jour : remplacer la
chaine "__" en "_20051212_"
J'ai essayé en vain :
find . -ctime 0 -exec mv {} 'echo {} | sed "/__/s//_20051212_/"' \;

j ai également essayé de passer par des trucs du genre
for i in *; ...

Quelqu'un pour m'aider ?

Merci d'avance,

Chmanu

6 réponses

Avatar
Matthieu Moy
chmanu writes:

find . -ctime 0 -exec mv {} 'echo {} | sed "/__/s//_20051212_/"' ;


Penser à la commande "rename" fournie avec perl. Moins portable, mais
très pratique.

Sinon, c'est la syntaxe de ton sed qui n'est pas bonne :

s/__/_20051212_/

--
Matthieu

Avatar
Emmanuel Fleury
Salut,

chmanu wrote:

J'aimerais renomer l'ensemble des fichiers de ce jour : remplacer la
chaine "__" en "_20051212_"
J'ai essayé en vain :
find . -ctime 0 -exec mv {} 'echo {} | sed "/__/s//_20051212_/"' ;

j ai également essayé de passer par des trucs du genre
for i in *; ...


Est-ce que ça marche ça:

for file in __*; do mv $file _20051212_${file##__}; done

Amicalement
--
Emmanuel Fleury

Ars longa, vita brevis.
-- Hippocrate

Avatar
Emmanuel Fleury
Emmanuel Fleury wrote:

Est-ce que ça marche ça:

for file in __*; do mv $file _20051212_${file##__}; done


Au passage, si quelqu'un pouvait m'expliquer la différence entre
${file##__} et ${file#_} je lui en serai éternellement reconnaissant.

Amicalement
--
Emmanuel Fleury

A journey of a thousand miles must begin with a single step.
-- Lao Tzu

Avatar
lhabert
chmanu :

find . -ctime 0 -exec mv {} 'echo {} | sed "/__/s//_20051212_/"' ;


Les arguments de la commande ne sont pas interprétés par un shell. Si tu
veux faire ce genre de manips, il faut appeler explicitement un shell :

-exec sh -c 'mv "$0" "`sed s/__/_20051212_/ <<EOF
$0
EOF
`"' '{}' ';'

Enfin en fait, je te conseilles plutôt la formulation :

-print0 | xargs -0 sh -c 'for f in "$@"; do mv "$f" "`sed s/__/_20051212_/ <<EOF
$f
EOF
`"
done' ploum

Avatar
lhabert
Emmanuel Fleury :

Au passage, si quelqu'un pouvait m'expliquer la différence entre
${file##__} et ${file#_} je lui en serai éternellement reconnaissant.


Je supposes que tu veux dire « ${file#__} » pour le deuxième?

En l'occurence, il n'y a pas de différence parce que le motif que tu mets ne
peut matcher que des chaines de taille fixe, mais si tu mets des étoiles
dans le motif, ça va faire une différence. Avec ##, tu sélectionnes le plus
long prefixe qui matche, tandis qu'avec #, tu sélectionnes le plus court.

Avatar
Emmanuel Fleury
Luc Habert wrote:

Je supposes que tu veux dire « ${file#__} » pour le deuxième?


Oui. J'ai fait une faute de frappe.

En l'occurence, il n'y a pas de différence parce que le motif que tu mets ne
peut matcher que des chaines de taille fixe, mais si tu mets des étoiles
dans le motif, ça va faire une différence. Avec ##, tu sélectionnes le plus
long prefixe qui matche, tandis qu'avec #, tu sélectionnes le plus court.


Aaaaah ! Ok.

Merci ! Je vais me coucher moins bête ce soir.

Amicalement
--
Emmanuel Fleury

`My doctor says that I have a malformed public-duty gland and
a natural deficiency in moral fibre, and that I am therefore
excused from saving Universes.'
-- Ford last attempt to get out of the story (Douglas Adams)