nom=echo "$fichier" | sed -e 's/\(.*\)\(\..*\)/\1/'
extension=echo "$fichier" | sed -e 's/\(.*\)\(\..*\)/\2/'
nouveaunom="${nom:0:20}"$extension
mv "$fichier" "$nouveaunom"
les répertoires ne sont que des fichiers (d'un type particulier).
Si ton dossier contient des répertoires, alors ils seront aussi renommés, mais il n'y aura pas de traitement des sous-répertoires, ni des sous-sous-répertoires ....
Par contre tu désire peut-être des modifications récursives alors il vaut mieux utiliser un «find».
Mais il faut faire deux passages pour renommer les répertoires
avant de renommer les fichiers et utiliser
l'option -depth pour commencer par les arborescences les plus internes.
Cela pourrait ressembler à cela :
for type in d f
do
for fichier in $(find dossier -depth -type $type | sort)
do
rep=$(dirname $fichier)
nom=$(basename $fichier)
nouveaunom=$(echo "$nom" | sed -e 's/\(.*\)\(\..*\)/\1/')
extension=$(echo "$nom" | sed -e 's/\(.*\)\(\..*\)/\2/')
nouveaunom="${nouveaunom:0:20}"$extension
echo mv "$fic" "$nouveaunom"
done
done
Je mets volontairement un «echo» devant le «mv» pour que tu puisse juger de la commande pouvant être exécutée avant d'exécuter réellement.