57 votes

Comment ajouter du texte en masse au début des noms de fichiers ?

Disons que j'ai un répertoire rempli de fichiers .md tous nommés de différentes manières. Disons que je veux ajouter "test" au début de chaque nom de fichier. Ainsi, par exemple : les fichiers a.md, b.md et c.md deviendraient respectivement test - a.md, test - b.md et test - c.md.

Comment puis-je accomplir cela via la ligne de commande ?

77voto

Daniel Hanrahan Points 1128

Une commande qui peut être facilement tapée directement depuis le terminal :

for f in *.md; do mv "$f" "test - $f"; done

Ou réécrite sur des lignes séparées au lieu d'utiliser des points-virgules :

for f in *.md
do
    mv "$f" "test - $f"
done

Exposition

Syntaxe de for (en sh) :

for NAME [in WORDS ... ] ; do COMMANDS; done

Ici, notre NAME est f et nos WORDS sont tous les fichiers dans le répertoire actuel correspondant à *.md. Ainsi, la variable $f sera substituée par chaque fichier correspondant à *.md.

Ainsi pour a.md :

mv "$f" "test - $f"

devient

mv "a.md" "test - a.md"

Les guillemets sont importants car chaque nom de fichier $f peut contenir des espaces. Sinon, mv penserait que chaque mot est un fichier séparé. Par exemple, s'il n'y avait pas de guillemets et qu'il y avait un fichier appelé Foo Bar.md, cela se traduirait par :

mv Foo Bar.md test - Foo Bar.md

ce qui ne fonctionnerait pas comme prévu. Mais en mettant $f entre guillemets, cela a du sens :

mv "Foo Bar.md" "test - Foo Bar.md"

Notant la syntaxe de for, vous pourriez également renommer un sous-ensemble de tous les fichiers *.md en les nommant explicitement :

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done

Ou en utilisant l'expansion du shell :

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done

11voto

James Mertz Points 390

Si vous avez prename...

prename 's/^/test - /' *.md

En utilisant des commandes shell ordinaires:

for file in *.md; do
    mv "$file" "test - $file"
done

7voto

Claudius Points 8060

mmv1,2 est également un très bon outil pour une telle tâche, appliqué au travail actuel, cela donnerait

mmv '*.md' 'test - #1.md'

Bien sûr, si vous voulez simplement ajouter "test - " à a.md, b.md et c.md, mais pas a1.md, quelque chose comme

mmv '?.md' 'test - #1.md'

serait plus approprié.

Je peux vraiment le suggérer, surtout si vous avez de nombreux problèmes de ce genre.

Si vous cherchez également une interface graphique, essayez gprename.

6voto

Au lieu d'utiliser une boucle for, qui échouera sur les espaces à moins de redéfinir la variable IFS, je recommanderais d'utiliser une boucle while combinée avec find. Ce qui suit fonctionnera lorsqu'il est exécuté à partir du même répertoire que les fichiers

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"
done

La ligne "basename" est là pour que find imprime seulement le nom du fichier - sans les composants du chemin qui pourraient faire échouer l'opération de renommage.

2voto

nullptr Points 121

Je sais qu'il est vraiment tard, mais si quelqu'un d'autre cherche quelque chose comme ça, alors cela a fonctionné pour moi :

rename '' 'nom -' *.md

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X