Usando el rename
(prename
en algunos casos) script que a veces se instala con Perl, puede usar expresiones de Perl para cambiar el nombre. El script omite el cambio de nombre si hay una colisión de nombres.
El siguiente comando cambia el nombre solo de los archivos que tienen cuatro o menos dígitos seguidos de una extensión ".txt". No cambia el nombre de los archivos que no se ajustan estrictamente a ese patrón. No trunca los nombres que constan de más de cuatro dígitos.
rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *
Algunos ejemplos:
Original Becomes
1.txt 0001.txt
02.txt 0002.txt
123.txt 0123.txt
00000.txt 00000.txt
1.23.txt 1.23.txt
Otras respuestas dadas hasta ahora intentarán cambiar el nombre de los archivos que no se ajustan al patrón, producir errores para los nombres de archivo que contienen caracteres que no son dígitos, realizar cambios de nombre que producen colisiones de nombres, intentar y fallar al cambiar el nombre de los archivos que tienen espacios en sus nombres y posiblemente otros problemas.
De una sola línea:
ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv
¿Cómo uso grep para hacer coincidir solo las líneas que contienen \d.txt (es decir, 1 dígito, luego un punto, luego las letras txt)?
grep -E '^[0-9]\.txt$'
Prueba:
for a in [0-9]*.txt; do
mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done
Cambie el patrón de nombre de archivo ([0-9]*.txt
) según sea necesario.
Un cambio de nombre enumerado de propósito general que no hace suposiciones sobre el conjunto inicial de nombres de archivo:
X=1;
for i in *.txt; do
mv $i $(printf %04d.%s ${X%.*} ${i##*.})
let X="$X+1"
done
Sobre el mismo tema:
- Script Bash para rellenar nombres de archivos
- Extraer nombre de archivo y extensión en bash
for a in *.txt; do
b=$(printf %04d.txt ${a%.txt})
if [ $a != $b ]; then
mv $a $b
fi
done