Utilisez-le avec bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
recherchera les fichiers avec un espace dans le nom. Les noms de fichiers seront imprimés avec un nullbyte ( -print0
) comme délimiteur pour gérer également les noms de fichiers spéciaux. Ensuite, la fonction read
intégrée lit les noms de fichiers délimités par le nullbyte et mv
remplace finalement les espaces par un trait de soulignement.
EDIT: Si vous souhaitez également supprimer les espaces dans les répertoires, c'est un peu plus compliqué. Les répertoires sont renommés et ne sont plus accessibles par les recherches de nom find
. Essaye ça:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
L' sort -rz
inverse l'ordre des fichiers, de sorte que les fichiers les plus profonds d'un dossier soient les premiers à se déplacer et que le dossier lui-même sera le dernier. Ainsi, il n'y a jamais de dossiers renommés avant que tous les fichiers et dossiers ne soient renommés à l'intérieur. La mv
commande dans la boucle est également un peu modifiée. Dans le nom cible, nous supprimons uniquement les espaces dans le nom de base du fichier, sinon il ne serait pas accessible.
find . -name "* *" -print0 | sort -rz | \ while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
En utilisant
rename
ou avec
$1
En utilisant
mv
ou avec
$1
la source
C'est une méthode que j'ai trouvée face au même problème:
J'écrivais un fichier de script bash pour mettre à jour automatiquement mes certificats SSL.
la source
Utilisation
rename
:Pas besoin de
find
:)la source