Utilisation du rename
(prename
dans certains cas) script qui est parfois installé avec Perl, vous pouvez utiliser des expressions Perl pour renommer. Le script ignore le changement de nom en cas de collision de noms.
La commande ci-dessous renomme uniquement les fichiers qui ont quatre chiffres ou moins suivis d'une extension ".txt". Il ne renomme pas les fichiers qui ne sont pas strictement conformes à ce modèle. Il ne tronque pas les noms composés de plus de quatre chiffres.
rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *
Quelques exemples :
Original Becomes
1.txt 0001.txt
02.txt 0002.txt
123.txt 0123.txt
00000.txt 00000.txt
1.23.txt 1.23.txt
D'autres réponses données jusqu'à présent tenteront de renommer les fichiers qui ne sont pas conformes au modèle, produiront des erreurs pour les noms de fichiers contenant des caractères non numériques, effectueront des renommages qui produisent des collisions de noms, essaieront et échoueront de renommer les fichiers qui ont des espaces dans leurs noms et peut-être d'autres problèmes.
Une ligne :
ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv
Comment puis-je utiliser grep pour faire correspondre uniquement les lignes qui contiennent \d.txt (IE 1 chiffre, puis un point, puis les lettres txt) ?
grep -E '^[0-9]\.txt$'
Essayez :
for a in [0-9]*.txt; do
mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done
Changer le modèle de nom de fichier ([0-9]*.txt
) si nécessaire.
Un changement de nom énuméré à usage général qui ne fait aucune hypothèse sur l'ensemble initial de noms de fichiers :
X=1;
for i in *.txt; do
mv $i $(printf %04d.%s ${X%.*} ${i##*.})
let X="$X+1"
done
Sur le même sujet :
- Script bash pour remplir les noms de fichiers
- Extraire le nom et l'extension du fichier dans bash
for a in *.txt; do
b=$(printf %04d.txt ${a%.txt})
if [ $a != $b ]; then
mv $a $b
fi
done