web-dev-qa-db-fra.com

Comment ajouter en masse du texte à des noms de fichiers?

Disons que j'ai un répertoire plein de fichiers .md, nommés de différentes manières. Disons que je voulais ajouter "texte" au début de chaque nom de fichier. Ainsi, par exemple, le fichier a.md, b.md et c.md deviendrait test - a.md, test - b.md et test - c.md.

Comment pourrais-je accomplir ceci via une ligne de commande?

44
Jesse Atkinson

Une ligne qui peut être facilement saisie directement depuis le terminal:

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

Ou réécrit sur des lignes séparées à la place en utilisant des points-virgules:

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

Exposition

Syntaxe de for (in sh):

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

Ici, notre NAME est f et notre WORDS sont tous les fichiers du répertoire actuel qui correspondent à *.md. Donc, la variable $f sera remplacée par chaque fichier correspondant à *.md.

Donc 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 existe un fichier appelé Foo Bar.md, il se traduirait par:

mv Foo Bar.md test - Foo Bar.md

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

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

En notant la syntaxe de for, vous pouvez é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 de Shell:

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

Si vous avez prename...

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

Utilisation de commandes Shell ordinaires:

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

mmv1 , 2 est également un outil très agréable pour une telle tâche. , appliqué à l'emploi actuel, il serait

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

Bien sûr, si vous voulez seulement 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 beaucoup de problèmes de ce type.

Si vous recherchez en outre une interface graphique, essayez gprename .

5
Claudius

Au lieu d'utiliser une boucle for, qui échouera sur les espaces sauf si vous redéfinissez la variable IFS, je vous recommande d'utiliser une boucle while combinée à find. Ce qui suit fonctionnera s’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 "nom_base" est là pour que find affiche uniquement le nom du fichier - sans les composants de chemin qui feraient interrompre l'opération de changement de nom.

5
Fred Clausen

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 '' 'name -' *.md
1
nullptr

Si vous avez zsh disponible, vous pouvez utiliser zmv:

autoload zmv
zmv -w '*' 'test - $1'

Vous pouvez tester la commande avec:

zmv -wn '*' 'test - $1'
  • -n signifie un essai à sec, c’est-à-dire uniquement ce qui va se passer.
  • -w met implicitement des parenthèses autour des caractères génériques, permet de faire des références arrières.
0
Thor

En bash, ajouter "Prepend text -" à tous les fichiers du dossier:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
0
Osiris