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?
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
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
Si vous avez prename
...
prename 's/^/test - /' *.md
Utilisation de commandes Shell ordinaires:
for file in *.md; do
mv "$file" "test - $file"
done
mmv
1 , 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 .
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.
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
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.En bash, ajouter "Prepend text -" à tous les fichiers du dossier:
for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;