J'ai un script qui me donne quelques problèmes, je sais que je dois le refaire de manière récursive mais j'ai des problèmes. Le script doit renommer tous les fichiers et dossiers d’un dossier en supprimant les caractères spéciaux tels que $ -,) (! Et en remplaçant "" par "_".
Voici le morceau que je dois refaire:
# Rename directories
find "$ORIG_DIR" -name "*" -type d| while read dname
do
NEW_DIR=`echo "$dname" |sed -E 's/^[ \t]*//g; s/[ \t]*$//g; s/\./_/g; s/\,/_/g; s/ /_/g'`
# Rename files
find "$ORIG_DIR" -name "*" -type f | while read fname
do
NEW_FNAME=`echo "$fname" |sed -E 's/^[ \t]*//g; s/[ \t]*$//g; s/\./_/g; s/(.*)_/\1\./; s/\,/_/g; s/ /_/g'`
if [ -e $NEW_FNAME ]
then
echo "$NEW_FNAME already exists. Not replacing $fname"
else
echo "Replacing $fname with $NEW_FNAME"
mv "$fname" $NEW_FNAME
fi
done
if [ -e $NEW_DIR ]
then
echo "$NEW_DIR already exists. Not replacing $dname"
else
echo "Replacing $dname with $NEW_DIR"
mv "$dname" $NEW_DIR
fi
done
END
find
les commandes traverseront toujours l’ensemble de l’arborescence (remplacez la fonctionnalité à l’intérieur par des instructions echo pour voir ce qui se passe).Réponses:
Non testé
Si ça vous va, supprimez le "echo"
La clé ici est l'option "-depth" à trouver. Il émettra "./sub dir / nom du fichier" avant "./sub dir". Sinon, si "./sub dir" est renommé "./subdir", vous obtiendrez une erreur "fichier non trouvé" lorsque la boucle while atteint "./sub dir / nom_fichier". En outre, cela signifie que vous n'avez pas besoin d'une logique différente pour les répertoires.
L'option "-print0" à rechercher et l'occupation autour de la commande de lecture permettent de s'assurer que les noms de fichiers comportant des espaces sont gérés correctement.
la source