scripts script resueltos programacion espaƱol ejercicios ejemplos comandos basicos linux bash shell grep

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.



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