resueltos - Script de shell de Linux para agregar ceros a los nombres de archivo
scripts bash ejemplos (9)
Esta versión también admite el manejo de cadenas antes (después) del número. Pero básicamente puedes hacer cualquier coincidencia de expresión regular + printf, siempre y cuando tu awk lo soporte. Y admite caracteres en espacios en blanco (excepto líneas nuevas) también en nombres de archivos.
for f in *.txt ;do
mv "$f" "$(
awk -v f="$f" ''{
if ( match(f, /^([a-zA-Z_-]*)([0-9]+)(/..+)/, a)) {
printf("%s%04d%s", a[1], a[2], a[3])
} else {
print(f)
}
}'' <<<''''
)"
done
Tengo una carpeta con aproximadamente 1.700 archivos. Todos son nombrados como 1.txt
o 1497.txt
, etc. Me gustaría cambiar el nombre de todos los archivos para que todos los nombres de los archivos tengan cuatro dígitos.
Es decir, 23.txt
convierte en 0023.txt
.
¿Qué es un script de shell que hará esto? O una pregunta relacionada: ¿cómo utilizo grep para hacer coincidir solo las líneas que contienen /d.txt
(es decir, un dígito, luego un punto y luego las letras txt
)?
Esto es lo que tengo hasta ahora:
for a in [command i need help with]
do
mv $a 000$a
done
Básicamente, ejecute eso tres veces, con comandos allí para encontrar nombres de archivos de un dígito, dos dígitos y tres dígitos (con el número de ceros iniciales modificados).
Para hacer coincidir solo archivos de texto de un solo dígito, puede hacer ...
$ ls | grep ''[0-9]/.txt''
Pista de una línea:
while [ -f ./result/result`printf "%03d" $a`.txt ]; do a=$((a+1));done
RESULT=result/result`printf "%03d" $a`.txt
Proporcionar una solución escrita con precaución para que sea correcta incluso en presencia de nombres de archivo con espacios:
#!/usr/bin/env bash
pattern=''%04d'' # pad with four digits: change this to taste
# enable extglob syntax: +([[:digit:]]) means "one or more digits"
# enable the nullglob flag: If no matches exist, a glob returns nothing (not itself).
shopt -s extglob nullglob
for f in [[:digit:]]*; do # iterate over filenames that start with digits
suffix=${f##+([[:digit:]])} # find the suffix (everything after the last digit)
number=${f%"$suffix"} # find the number (everything before the suffix)
printf -v new "$pattern" "$number" "$suffix" # pad the number, then append the suffix
if [[ $f != "$new" ]]; then # if the result differs from the old name
mv -- "$f" "$new" # ...then rename the file.
fi
done
Supongamos que tiene archivos con datatype .dat en su carpeta. Simplemente copie este código en un archivo llamado run.sh, chmode +x run.sh
ejecutable ejecutando chmode +x run.sh
y luego ejecute usando ./run.sh
:
#!/bin/bash
num=0
for i in *.dat
do
a=`printf "%05d" $num`
mv "$i" "filename_$a.dat"
let "num = $(($num + 1))"
done
Esto convertirá todos los archivos en su carpeta a filename_00000.dat
, filename_00001.dat
, etc.
Tratar:
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 uso 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:
Un trazador de líneas:
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 (IE 1 dígito, luego un punto y luego las letras txt)?
grep -E ''^[0-9]/.txt$''
Usando el prename
rename
( prename
en algunos casos) que a veces se instala con Perl, puede usar expresiones de Perl para hacer el cambio de nombre. El script omite el cambio de nombre si hay una colisión de nombre.
El siguiente comando cambia el nombre de los archivos que tienen cuatro o menos dígitos seguidos por una extensión ".txt". No cambia el nombre de los archivos que no se ajustan estrictamente a ese patrón. No trunca 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 nombres de archivo que contengan caracteres que no sean dígitos, realizar cambios de nombre que produzcan colisiones de nombres, intentar y no cambiar el nombre de archivos que tengan espacios en sus nombres y posiblemente otros problemas.
for a in *.txt; do
b=$(printf %04d.txt ${a%.txt})
if [ $a != $b ]; then
mv $a $b
fi
done