J'essaie de renommer des fichiers comme celui-ci:
for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done
Mais la sed
commande remplace tous les espaces par _
.
Comment puis-je modifier la sed
commande pour y inclure des espaces avec les caractères spécifiés? J'ai essayé d'utiliser \s
mais ça ne marche pas ...
EDIT:
Par exemple: le fichier trip: hill
, devrait être renommé:, trip_ hill
mais la commande ci-dessus le fait trip__hill
.
command-line
bash
sed
batch-rename
Zanna
la source
la source
Réponses:
Ne pas analyser les noms de fichiers avec
sed
! La sortie deecho "$file"
peut ne pas être fiable.Utilisez
rename
. Le 17.10, vous devez d'abord l'installerEnsuite:
Remarques
-n
après le test pour renommer réellement les fichiers--
fin des options dans le cas où un fichier commence par-
[^-A-Za-z0-9_ .]
les caractères que nous ne voulons pas remplacer - mis en-
premier ou en dernier afin qu'il ne puisse pas indiquer une plage (il est traité littéralement dans ces positions)..
est traité littéralement (dans d'autres contextes d'expression régulière, il représente n'importe quel caractère et doit être échappé).Cela fonctionne également dans
sed
:Si j'ajoute un espace à la fin dans votre version, j'obtiens une erreur:
Mais
-
à la fin, ça marche:Peut-être que la position du trait d'union a causé votre problème lorsque vous avez ajouté l'espace. Mais le conseil de ne pas analyser les noms de fichiers est valable!
la source
.
c'était littéral dans une classe de caractères. TIL!Vous pouvez également simplement utiliser le shell, l'expansion des paramètres de Bash peut faire une substitution:
La double barre oblique lui dit de remplacer toutes les correspondances, à part cela, la syntaxe est simple.
la source