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

44

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

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

Jesse Atkinson
la source

Réponses:

60

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(en sh):

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

Ici, nos NAMEest - fet nos WORDSsont tous les fichiers du répertoire correspondant en cours *.md. Donc, la variable $fsera substituée à 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 $fpeut contenir des espaces. Sinon, mvje penserais que chaque mot est un fichier séparé. Par exemple, s'il n'y avait pas de guillemets et qu'un fichier est 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 mettant $fentre 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 *.mdfichiers en les nommant explicitement:

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

Ou en utilisant une expansion de shell:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done
QuasarDonkey
la source
C'est exactement ce que j'avais besoin de voir. Merci!
Ryan
11

Si vous avez prename...

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

Utiliser des commandes shell ordinaires:

for file in *.md; do
    mv "$file" "test - $file"
done
Grawity
la source
Comment puis-je obtenir prename?
Gaʀʀʏ
Semble être préinstallé pour moi sur Ubuntu 16.04 LTS. Avez-vous essayé votre gestionnaire de paquets (c.-à-d., sudo apt-get install)?
Orion751
5

mmv1 , 2 est également un très bon outil pour une telle tâche, appliquée au travail en cours, 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 .

Claudius
la source
5

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.

Fred Clausen
la source
2

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
nullptr
la source
1
simple et direct
user13743
0

Si vous en avez, zshvous pouvez utiliser zmv:

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

Vous pouvez tester la commande avec:

zmv -wn '*' 'test - $1'
  • -n signifie run-dry, c'est à dire montrer seulement ce qui va se passer.
  • -w met implicitement des parenthèses autour des caractères génériques, fait en sorte que les références arrière fonctionnent.
Thor
la source
0

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

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
Osiris
la source
C'est un très long chemin d'écriturefor i in *; do mv "$i$" "Prepend text - $i"; done
David Richerby,