¿hay alguna manera de reemplazar un caracter del nombre de un archivo por otro?

Es decir tengo estos directorios:

/ftp/1
/ftp/2
/ftp/la
/ftp/lala
/ftp/lolo

dentro de cada uno hay varios archivos (creados por usuarios windows) algunos contienen acentos y otros no. Es posible hacer algun script para que canvie todas la letras acentuadas (àáèéìíòóùú) por las mismas pero sin acentuar? por que en vez de los 5 directorios son algunos mas, y si tengo que hacerlo uno por uno......... me muero


me solucionais un problemon...

gracias
Escrito originalmente por nandelbosc
[...]
dentro de cada uno hay varios archivos (creados por usuarios windows) algunos contienen acentos y otros no. Es posible hacer algun script para que canvie todas la letras acentuadas (àáèéìíòóùú) por las mismas pero sin acentuar? por que en vez de los 5 directorios son algunos mas, y si tengo que hacerlo uno por uno......... me muero

me solucionais un problemon...


Si tienes "rename" es bastante sencillito:

$ find /path/ -exec rename 'y/áéíóú/aeiou/' '{}' \;


Si no tienes "rename", me temo que te toca hacer un pequeño script que emule el comportamiento de "rename" haciendo uso de "tr" y "mv". Algo así:

#!/bin/sh

NUEVONOMBRE=$(echo "$*" | tr "áéíóú" "aeiou")
mv "$*" "$NUEVONOMBRE"


Creo que esto funcionaría como sustituto del rename 'y/áéíóú/aeiou/', aunque no he probado si hay algún problema con nombres que contienen espacios. Y sabiendo quiénes han dado nombre a los ficheros, no me extrañaría nada que hubiese.
muchas gracias por la respuesta, pero no estoy muy seguro que funcione, ya que sigo teniendo que especificar el nombre nuevo, para cada fichero.

a lo mejor no lo he entendido muy bien, y con el find como lo pones ya busca estos caracteres y los sustituye, esta tarde lo provaré, ya os contaré que tal.

p.d.:esta rename, y, evidentemente, los usuarios ponen espacios, ?, ., áàéèíìóòúù. y todo lo que les digas que mejor no pongan ;-) aunque con solo eliminar acentos ya seria mas feliz.
además...

acabo de provar-lo y no habia penssado en que desde shell tampoco veo acentos, sino que son "?". aaaaahhh!!!!

aun teniendo configurado correctamente el teclado e idioma.

además de esta linea en samba server:

character set = ISO8859-1



seguiré investigando
Escrito originalmente por nandelbosc
a lo mejor no lo he entendido muy bien, y con el find como lo pones ya busca estos caracteres y los sustituye, esta tarde lo provaré, ya os contaré que tal.


Funciona así:

find /ftp/


Te devuelve todos los ficheros y directorios que se encuentran en esa parte del árbol de directorios. Además, si haces esto:

find /ftp/ -exec comando '{}'  \;


cada una de los ficheros y directorios se usan como parámetro para la ejecución de "comando".

Por ejemplo,

find /ftp/ -exec rm '{}'  \;


Te borraría todo lo que contiene /ftp (en realidad, fallaría con los directorios, pero es lo de menos).

Por otro lado "rename" sirve para renombrar ficheros usando expresiones regulares. Yo simplemente he puesto que á -> a, é -> e, etc... Puedes enriquecerlo un poco. Por ejemplo:

'y/áàäâéèëêíìïîóòöôúùüû ,?/aaaaeeeeiiiioooouuuu___/'

Así eliminarías las letras acentuadas y convertirías los espacios, las comas y el signo de interrogación en "_". Si no es exactamente lo que quieres, cambia la expresión.
He escrito:

find /mnt/ftp1/ -exec rename 'y/áàäâÀÁéèëêÈÉíìïîÍÌóòöôÓÒúùüûÚÙ ,?/aaaaAAeeeeEEiiiiIIooooOOuuuuUU___/' '{}' \

sale en la consola:


>

(como si esperara algun otro comando), pulso enter y me devuelve este error:

find: missing argument to `-exec'

sin canviar ningun caracter, claro
Escrito originalmente por nandelbosc
He escrito:

[B]find /mnt/ftp1/ -exec rename 'y/áàäâÀÁéèëêÈÉíìïîÍÌóòöôÓÒúùüûÚÙ ,?/aaaaAAeeeeEEiiiiIIooooOOuuuuUU___/' '{}' \


(como si esperara algun otro comando), pulso enter y me devuelve este error:


Lo que espera es que escribas un carácter: recuerda que "\" es el símbolo de escape,

Fíjate bien: te falta el punto y coma (;) al final
bueno, ya esta solucionado

el script anterior se ejecuta correctamente, pero no me canvia ninguno de los carácteres que queria.

al final lo he resuelto de un forma algo chapuza, pero efectiva:

los problemas los tenia con samba, que no me dejaba ejecutar ni canviar ningun nombre de ficheros con acentos, "ñ" o "ç", simpre que estuviera creado desde Linux, pero si paso un fichero desde win al servidor linux via samba no importa que contenga acentos, ni "ñ" ni nada, se lo traga correctamente.
Lo que hice fué passar via ssh todos los ficheros a una estación con winxp i luego los volví a enviar al servidor (desde samba en vez de ssh), de esta manera me lo reconoce todo.

Admás todo el mundo está amenazado de ser desterrado del pueblo si me vuelven a poner acentos ;-)

gracias por las respuestas
Revivo este hilo porque quería hacer algo parecido y me he encontrado con un problemilla. Yo lo que quiero es que busque una cadena determinada y la sustituya por otra. He probado con la expresión
$ find ../ -exec rename 'cerca' 'lejos' '{}' \;
El problema viene cuando encuentra un directorio con la cadena cerca y este a su vez contiene un fichero con la cadena. Por lo que he podido comprobar renombra el directorio y luego no lo hace con los ficheros y subdirectorios que cuelgan de él, porque los busca con la ruta antigua.

Si no ha quedado claro decidme y lo explico un poco mejor.

A ver si alguien me puede AUXILIAR XD

Un saludo.
Escrito originalmente por musikal
He probado con la expresión
$ find ../ -exec rename 'cerca' 'lejos' '{}' \;
El problema viene cuando encuentra un directorio con la cadena cerca y este a su vez contiene un fichero con la cadena. Por lo que he podido comprobar renombra el directorio y luego no lo hace con los ficheros y subdirectorios que cuelgan de él, porque los busca con la ruta antigua.


Es tarde ya y no tengo ganas de hacer pruebas. Si es como dices se me ocurre la siguiente chapucilla:

$ find ../ -type f -exec rename 'cerca' 'lejos' '{}' \;
$ find ../ -type d -exec rename 'cerca' 'lejos' '{}' \;

O sea, cambias primero los nombres de los ficheros y luego los nombres de los directorios.
¿Te satisface?


A ver si alguien me puede AUXILIAR


Qué graciosillo, el nene.

Hala, a la cama que mañana hay que hacer como que se trabaja.
Pues no termina de cuajar la cosa. No sé, yo también me voy a la cama, que mañana toca estudiar.
Si lo pongo con ficheros me da el siguiente error.

rename: fallo al cambiar el nombre de ../lejosylejos/mucerca/aquicerca a ../lejosylejos/mulejos/aquicerca: No such file or directory

Si lo pongo con directorios

find: ../lejosylejos/mucerca: No such file or directory

La estructura que tengo es:
ls -l lejosylejos/
total 32
drwxrwxrwx 2 root root 16384 feb 6 01:10 mulejos/
-rwxrwxrwx 1 root root 3 feb 6 01:11 nomuylejos*

ls -l mulejos
total 16
-rwxrwxrwx 1 root root 2 feb 6 01:10 aquicerca*

Ya no sé lo que ha hecho, porque no sé si ha renombrado mucerca a mulejos cuando le he puesto lo de archivo o lo de directorio, pero como ves sigue sin hacerlo porque algunos no cambian. Mañana lo hago bien desde el principio que yo también tengo sueño. XD

Qué graciosillo, el nene.

Te has dado cuenta del mensaje subliminal, eh? Soy todo sutileza [carcajad]
Un saludo
Escrito originalmente por musikal
Pues no termina de cuajar la cosa.


Sí, parece que find le pasa el nombre del directorio a rename (por cierto, tienes un ejecutable diferente al mío con distinta sintaxis), pero luego sigue usando el nombre antiguo para seguir descendiendo. Y claro, el directorio ya no se llama así. A menos que alguien diga lo contrario, me parece que find no te va a servir. La solución: hacerte tú un script que descienda recursivamente por los directorios haciendo los cambios.

Tengo por mi disco duro un script que hace más o menos eso, pero esta mañana no tengo tiempo para modificarlo. Por la tarde te lo hago, si aún no has resuelto el problema.
Pues no tengo ni idea de hacerlo y tampoco tengo mucho tiempo, que ahora estoy con los exámenes, así que si encuentras el scriptillo ese y me lo pasas y me das alguna pistilla ya intentaré hacerlo. Ahora que si lo quieres hacer tú adelante, no te quiero quitar la gloria. XD
Lo de que tiene sintaxis distinta, no sé por qué lo dices, pero quizá sea algún alias de MDK al que tu tienes con algún parámetro.

Un saludo.
Escrito originalmente por musikal
[B]Pues no tengo ni idea de hacerlo y tampoco tengo mucho tiempo, que ahora estoy con los exámenes, así que si encuentras el scriptillo ese y me lo pasas y me das alguna pistilla ya intentaré hacerlo. Ahora que si lo quieres hacer tú adelante, no te quiero quitar la gloria.


A mí me entretiene hacer chapucillas. Si tengo tiempo, lo hago: no es molestia; es, simplemente, cuestión de tiempo.

Lo de que tiene sintaxis distinta, no sé por qué lo dices, pero quizá sea algún alias de MDK al que tu tienes con algún parámetro.


Porque con el rename que tengo yo habría que haber escrito:

rename 's/cerca/lejos/g'

Este rename es un script en perl, hecho por el propio Larry Wall, que viene (al menos en debian) en el mismo paquete de perl. Y lo que exige como parámetro es una expresión regular de perl

De todos modos, da igual. En mi script no lo uso: basta una invocación a sed. Y si lo que se pretende siempre es sustituir una cadena por otra sin más complicaciones, ni eso: bash resuelve todo.
¡Una joya, oiga!

Bien después de haber perdido un par de horas, tengo que darme ánimos. ;-)

En serio, me ha parecido un buen ejercicio. Utiliza muchísimas cosas de bash (evaluación previa de comandos con eval, expansión de parámetros, vectores, funciones, recursividad, historial de directorios usando 'pushd' en vez de 'cd', etc...). Para el que esté aprendiendo bash o sólo tenga unos conocimientos básicos, me parece bastante provechoso que lo vaya leyendo e intentando entenderlo con la página del manual de bash.

El script es recursivo, sigue los directorios y también los enlaces simbólicos que apuntan a otros directorios. Y, supuestamente, sin entrar en recursividad infinita: si un directorio ya lo visitó, rechazará volver a visitarlo.

Funcionamiento:

Admite la lista de ficheros bien en la propia línea de comandos o bien a través de la entrada estandar. Por ejemplo, este es el directorio de pruebas:

.:
total 4
drwxr-xr-x    4 josem    usuarios     4096 2004-02-06 21:07 cercaycerca

./cercaycerca:
total 8
drwxr-xr-x    2 josem    usuarios     4096 2004-02-06 19:44 cerca cerca
drwxr-xr-x    3 josem    usuarios     4096 2004-02-06 21:07 mucerca
-rw-r--r--    1 josem    usuarios        0 2004-02-06 09:17 nomuycerca

./cercaycerca/cerca cerca:
total 0

./cercaycerca/mucerca:
total 4
drwxr-xr-x    2 josem    usuarios     4096 2004-02-06 09:18 aquicerca
lrwxrwxrwx    1 josem    usuarios        6 2004-02-06 19:38 cerca-inicio -> ../../

./cercaycerca/mucerca/aquicerca:
total 0


Hay de todo un poco: unos cuantos niveles de directorios y además un directorio con un espacio en medio del nombre y un enlace simbólico que regresa a un nivel superior, de modo que si uno no se cuida de hacer comprobaciones, entra en un bucle infinito.

La forma de usarlo sería, por ejemplo

$ rename.sh 's/cerca/lejos/g' *

Es decir, el primer parámetro una expresión regular de sed. Esta del ejemplo sustituye todas las apariciones de la cadena "cerca" por la cadena "lejos". El segundo parámetro es la lista de ficheros a los que se quiere aplicar la sustitución. En este caso "*", es decir, todos:

$ rename.sh 's/cerca/lejos/g' *
Renombrando ficheros aplicando el guión de sed 's/cerca/lejos/g'...

Cambiando al directorio /home/josem/pruebas/musikal/cercaycerca...
Cambiando al directorio /home/josem/pruebas/musikal/cercaycerca/cerca cerca...
Retrocediendo a /home/josem/pruebas/musikal/cercaycerca...
  /home/josem/pruebas/musikal/cercaycerca/cerca cerc ---> /home/josem/pruebas/musikal/cercaycerca/lejos lejos
Cambiando al directorio /home/josem/pruebas/musikal/cercaycerca/mucerca...
Cambiando al directorio /home/josem/pruebas/musikal/cercaycerca/mucerca/aquicerca...
Retrocediendo a /home/josem/pruebas/musikal/cercaycerca/mucerca...
  /home/josem/pruebas/musikal/cercaycerca/mucerca/aq ---> /home/josem/pruebas/musikal/cercaycerca/mucerca/aquilejos
  cerca-inicio                                       ---> lejos-inicio
Retrocediendo a /home/josem/pruebas/musikal/cercaycerca...
  /home/josem/pruebas/musikal/cercaycerca/mucerca    ---> /home/josem/pruebas/musikal/cercaycerca/mulejos
  nomuycerca                                         ---> nomuylejos
Retrocediendo a /home/josem/pruebas/musikal...
  /home/josem/pruebas/musikal/cercaycerca            ---> /home/josem/pruebas/musikal/lejosylejos


Acaba sin entrar en un bucle infinito y deja el árbol de pruebas así:

.:
total 4
drwxr-xr-x    4 josem    usuarios     4096 2004-02-06 21:17 lejosylejos

./lejosylejos:
total 8
drwxr-xr-x    2 josem    usuarios     4096 2004-02-06 19:44 lejos lejos
drwxr-xr-x    3 josem    usuarios     4096 2004-02-06 21:17 mulejos
-rw-r--r--    1 josem    usuarios        0 2004-02-06 09:17 nomuylejos

./lejosylejos/lejos lejos:
total 0

./lejosylejos/mulejos:
total 4
drwxr-xr-x    2 josem    usuarios     4096 2004-02-06 09:18 aquilejos
lrwxrwxrwx    1 josem    usuarios        6 2004-02-06 19:38 lejos-inicio -> ../../

./lejosylejos/mulejos/aquilejos:
total 0


Si no se quiere que el script actúe de modo recursivo, basta con anteponer a la lista de ficheros un puntro (.):

$ rename.sh 's/lejos/cerca/g' . *
Renombrando ficheros aplicando el guión de sed 's/lejos/cerca/g'...

  /home/josem/pruebas/musikal/lejosylejos            ---> /home/josem/pruebas/musikal/cercaycerca


También se puede usar la entrada estándar para dar la lista de ficheros:

$ rename.sh 's/lejos/cerca/g'
Introduzca los ficheros a continuación
Escriba tal y como lo haría en la línea de comandos
(comodines, escape de espacios "\ ", etc...)
Pulse Ctrl+D para acabar la entrada
*
../*
Renombrando ficheros aplicando el guión de sed 's/lejos/cerca/g'...

Cambiando al directorio /home/josem/pruebas/musikal/cercaycerca...
Cambiando al directorio /home/josem/pruebas/musikal/cercaycerca/lejos lejos...
Retrocediendo a /home/josem/pruebas/musikal/cercaycerca...
  /home/josem/pruebas/musikal/cercaycerca/lejos lejo ---> /home/josem/pruebas/musikal/cercaycerca/cerca cerca
Cambiando al directorio /home/josem/pruebas/musikal/cercaycerca/mulejos...
Cambiando al directorio /home/josem/pruebas/musikal/cercaycerca/mulejos/aquilejos...
Retrocediendo a /home/josem/pruebas/musikal/cercaycerca/mulejos...
  /home/josem/pruebas/musikal/cercaycerca/mulejos/aq ---> /home/josem/pruebas/musikal/cercaycerca/mulejos/aquicerca
  lejos-inicio                                       ---> cerca-inicio
Retrocediendo a /home/josem/pruebas/musikal/cercaycerca...
  /home/josem/pruebas/musikal/cercaycerca/mulejos    ---> /home/josem/pruebas/musikal/cercaycerca/mucerca
  nomuylejos                                         ---> nomuycerca
Retrocediendo a /home/josem/pruebas/musikal...
Cambiando al directorio /home/josem/pruebas/caquita...
Retrocediendo a /home/josem/pruebas/musikal...


Y aquí va el código:

#!/bin/sh

# rename.sh: Renombra ficheros a partir de una expresión regular de sed
# Sintaxis:
#    rename.sh 'expresion-regular' [.] [ficheros]
#    'expresion-regular' = según la sintaxis de sed
#    .                   = implica que no se quiere recursividad
#    ficheros            = directorios y ficheros a lo que se aplica.
#                          Se no se indica ninguno, se pedirá su introducción
#                          por la entrada estándar.
# Ejemplos:
#    rename.sh 's/\.JPG$/.jpg/' . *
#        Cambia todas las extesiones JPG a jpg. "." implica que no
#        se desea recursividad y "*" que se aplica el cambio a todos los
#        ficheros del directorio actual
#    rename.sh 's/\.JPG$/.jpg/' *
#        Como en el caso anterior, pero con recursividad
#    rename.sh 's/\.JPG$/.jpg/' * ../*paco*
#        Cambia todas las extensiones JPG a jpg recursivamente a los todos
#        ficheros del directorio actual y a los ficheros del directorio
#        padre que contengan en su nombre la cadena padre.
#    rename.sh 's/\.JPG$/jpg/'
#        Cambia todas las extensiones JPG por jpg a los ficheros que se
#        introduzcan por teclado a continuación
#    rename.sh 's/\.JPG$/jpg/' < ficheros.txt
#        Cambia todas las extensiones JPG por jpg a los ficheros que se
#        encuentren listados en ficheros.txt

function renombra() {
   nombrebase=${1##*/}
   path=${1%$nombrebase}
   destino=${path}`echo $nombrebase | sed "$regexp"`
   if [ ! -e "$destino" ]; then
      mv "$1" "$destino" && \
      printf "  %-50.50s ---> %s\n" "$1" "$destino"
   fi
}

function recorre() {
   local origen # En bash las variables son por defecto ¡globales!
   for origen in "$@"; do
      [ -d "$origen" ] && [ ! -L "$origen" ] &&   origen=`readlink -f "$origen"`
      if [ "$recursividad" = "SI" ]; then
         if [ -L "$origen" ]; then
            renombra "$origen"  # Renombramos el enlace en sí.
            origen=`readlink -f "$origen"`  # Calculamos el destino   
         fi

         if [ -d "$origen" ]; then
            # Comprobamos si ya se visitó el directorio de destino
            for visitado in "${DIRSTACK[@]}"; do
               # DIRSTACK almacena $HOME como ~
               [ -z "${visitado%%\~*}" ] && visitado="$HOME${visitado#\~}"
               [ "$origen" = "$visitado" ] && break
            done
            if [ "$origen" != "$visitado" ] && pushd "$origen" > /dev/null ; then
               echo -e "\e[0;31mCambiando al directorio ${origen}...\e[m"
               recorre *
               # No borramos el directorio de la pila, sino que
               # lo metemos al final, así no desaparece de
               # DIRSTACK y podremos saber más adelante si
               # anteriormente entramos en él.
               pushd +1 > /dev/null
               echo -e "\e[0;32mRetrocediendo a $PWD...\e[m"
            fi
         fi
      fi
      
      [ -e "$origen" ] && renombra "$origen"
   done
            
}

# Análisis de los parámetros
if [ ${#} -eq 0 ]; then  # No hay parámetros
   echo "Error: ha de indicar al menos la expresión regular" >&2
   echo "Sintaxis: $0 'regexp' [.] [ficheros]" >&2
   exit 1
else
   regexp="$1"
   
   if [ "$2" = "." ]; then
      recursividad="NO"
      preficheros=2
   else
      recursividad="SI"
      preficheros=1
   fi
   
   shift $preficheros # Elimina de $@ los parámetros que no son ficheros
   
   if [ ${#} -ne 0 ]; then
      ficheros='"$@"'
   else   # No hay ficheros: entrada estándar
      echo "Introduzca los ficheros a continuación"
      echo "Escriba tal y como lo haría en la línea de comandos"
      echo "(comodines, escape de espacios "\ ", etc...)"
      echo "Pulse Ctrl+D para acabar la entrada"
      eval entrada=(`cat`) # Escribe las entradas en un vector
      ficheros='"${entrada[@]}"'
   fi
fi
# Fin del análisis

# Deshace el posible enlace simbólico en el path
pushd `readlink -f "$PWD"` > /dev/null

echo "Renombrando ficheros aplicando el guión de sed '$regexp'..."
echo

eval recorre $ficheros

popd > /dev/null # Regresa al directorio original
joer auxiliar, como te lo curras [tadoramo] [tadoramo] [tadoramo]

Salu2
[flipa] Que pasada. Pero se me olvidó decirte que ya no lo necesito, lo siento.






























Es broma, muchas gracias. Así a primera vista he encontrado un fallo (mal empezamos[noop] ):

# rename.sh 's/\.JPG$/.jpg/' * ../*paco* # Cambia todas las extensiones JPG a jpg recursivamente a los todos # ficheros del directorio actual y a los ficheros del directorio # padre que contengan en su nombre la cadena padre.

Aquí debería poner paco, a no ser que tu padre se llame así, en ese caso $padre [sonrisa]

Ahora en serio, es la leche. Con el código no me meto muy a fondo porque no tengo ni idea [fies] pero se ve que está muy currado. Me lo guardo y cuando deje de ser un luser y aprenda en serio algo de bash lo miraré con detenimiento, sin duda me servirá para aprender. Muchas gracias por tu tiempo, gente como tú hace que merezca la pena este foro. Ays, ya me estoy poniendo romántico.[ayay]
Como me jode que casi nadie entre aquí a ver esto y comente cosillas como ya a pasado en algún otro hilo, menos mal que bateman por lo menos lo ha leído, porque es algo que sin duda merece la pena. Ellos se lo pierden.

PD: Veo que has borrado el hilo ese que te citabas a ti mísmo sin venir a cuento. ¿eres un poco ególatra no? (aunque hayas intentado disimularlo)

PD2: Lo he probado y no se que habré puesto mal pero en vez de sustituir la cadena ha sustituido todos los caracteres de la cadena y la he líado, y lo he tenido que renombrar a mano (menos mal que no he usado recursividad [tomaaa] ). Luego ya he espabilado (aprendo rápido XD) y lo he hecho con unos directorios de prueba y sin problemas [oki]

Un saludo y gracias de nuevo. [tadoramo]
Escrito originalmente por musikal
currado. Me lo guardo y cuando deje de ser un luser y aprenda en serio algo de bash lo miraré con detenimiento, sin duda me servirá para aprender.


Pues cuando llegue el día, ya sabes que te puedes pasar apreguntar...

PD2: Lo he probado y no se que habré puesto mal pero en vez de sustituir la cadena ha sustituido todos los caracteres de la cadena y la he líado, y lo he tenido que renombrar a mano (menos mal que no he usado recursividad [tomaaa] ). Luego ya he espabilado (aprendo rápido) y lo he hecho con unos directorios de prueba y sin problemas


Yo he procurado probarlo unas cuantas veces antes de enviarlo, pero puedo contener algún bug. Deberías haberte apuntado ese primer ejemplo y habérmelo enviado para decirdir si había sido un error tuyo o un error del programa.
Refloto el hilo para ver si me puedes solucionar una duda.
Me ha vuelto a pasar lo mismo de la otra vez (no aprendo tan rápido XD).
El problema es que si meto corchetes en la expresión sustituye las letras que haya entre los corchetes y no la expresión. Si utilizo la "\" antes de los corchetes me dice que es una expresión no válida. He estado probando con comillas y tal pero no he sabido hacerlo funcionar.¿Alguna sugerencia?
Por otra parte, si me puedes explicar para que son la s, la g y el $ de aquí:
# rename.sh 's/\.JPG$/.jpg/' . *
$ rename.sh 's/cerca/lejos/g' *

EDITO: En uno de los enlaces del manual de sed que posteaste he encontrado lo que significa lo que preguntaba:
///gc es interactivo y pregunta por una confirmación. s///g no es interactivo
^ Inicio de una línea
$ Final de una línea


De momento sigo sin encontrar lo de los caracteres de escape, al menos para el corchete, porque en el ejemplo de los .jpg, sí utilizas la contrabarra. [reojillo]

Voy a seguir buscando que no hay sueño [+risas]
Un saludo.
Escrito originalmente por musikal
El problema es que si meto corchetes en la expresión sustituye las letras que haya entre los corchetes y no la expresión.

¿Te refieres a esto?

$ echo "[ABC]" | sed 's/\[ABC\]/Cambiado/'
Cambiado

Por otra parte, si me puedes explicar para que son la s, la g y el $ de aquí:
# rename.sh 's/\.JPG$/.jpg/' . *
$ rename.sh 's/cerca/lejos/g' *

EDITO: En uno de los enlaces del manual de sed que posteaste he encontrado lo que significa lo que preguntaba:


Lo has encontrado a medias:

s, significa sustituir; "g" significa "todas las ocurrencias". Si no incluyes "g" sólo sustituye la primera.
Lo has encontrado a medias:

s, significa sustituir; "g" significa "todas las ocurrencias". Si no incluyes "g" sólo sustituye la primera.

Sí luego lo ví en otro de los links, el de bulma, pero seguí buscando esto y se me olvidó ponerlo. :P
No he conseguido que funcione, y ya me estoy desesperando un poco. [burla2]
Si pongo esta expresión:
rename.sh -i 's/\[mio\]/tuyo/g' *
No renombra [mio] por tuyo, sino que lo añade al final. Si tengo [mio]lalala lo renombra a [mio]lalalatuyo

Voy a seguir investigando.

EDITO: No había visto tu respuesta (lo que está dentro de la cita). No sé, yo lo he usado como te he puesto ahí, pero no creo que el problema sea por el directorio ( [mio] es un direcotrio en este caso ) Voy a probar a ver.
2ª EDICIÖN: XD Me hace lo mismo:
$ mkdir [mio]
$ echo "[mio]" | rename.sh 's/\[mio\]/tuyo/g'
$ ls
[mio]tuyo/


Un saludo.
Escrito originalmente por musikal

Si pongo esta expresión:
rename.sh -i 's/\[mio\]/tuyo/g' *
No renombra [mio] por tuyo, sino que lo añade al final. Si tengo [mio]lalala lo renombra a [mio]lalalatuyo

Voy a seguir investigando.


Toda la razón. El script falla. En concreto falla el cálculo de el nombre del archivo y de su path.

Sustituye las líneas en que se definen:

nombrebase=${1##*/}
path=${1%$nombrebase}


Por estas otras:

nombre=${1%/}
nombrebase=${nombre##*/}
path=${nombre%"$nombrebase"}



En concreto el fallo se debía a que no había puesto las comillas. El añadir la primera de las líneas es para corregir la posibilidad de que escribas un directorio acabado en "/", que es posible. Vamos, que he corregido dos bug por el precio de uno. ;-)

$ ls -ld \[*
drwxr-xr-x    3 josem    usuarios     4096 2004-02-10 15:28 [musikal]
$ rename.sh 's/\[musikal\]/alacazadelbug/' . \[musikal\]/  >/dev/null
$ ls -ld alacazadelbug
drwxr-xr-x    3 josem    usuarios     4096 2004-02-10 15:28 alacazadelbug
Sustituye las líneas en que se definen:

nombrebase=${1##*/}
path=${1%$nombrebase}



Por estas otras:

nombre=${1%/}
nombrebase=${nombre##*/}
path=${nombre%"$nombrebase"}

te podías haber currado un parche. [sati]
Es broma, gracias, ahora funciona perfectamente, al menos de momento. Ya sabía yo que no era fallo mío :P

A ver si cuando termine los dichosos exámenes me miro bien el script. Por lo menos me ha servido para aprender un poco de sed. Por cierto, muy buenos los enlaces. Tu tutorial lo tengo en tareas pendientes (sólo lo miré por encima) junto con el manual de ferdy. ;), y los libros esos de los que hablábais el otro día, de "La Catdral y el Bazar" y el de "Trampa en el Ciberespacio".

Me voy a jartar de leer. XD

Un saludo.
subo este antiguo hilo, a ver si me podeis ayudar

tengo que renombrar una serie de archivos
001.part
001.part.met
001.part.met.bck
...
son, como ya sabreis del emule, el caso es que uso amule y muchos temportales que tenia en otra maquina win quiero pasarlos al amule
lo que querria hacer es un ls y a cada archivo extraerle los 3 primeros caracteres y sumarle 75(por ej), de esa manera quedaria
076.part
076.part.met
076.part.met.bck
077.part
077.part.met
077.part.met.bck
....
y asi no se me solaparian con los archivos actuales
antes sabia un poquillo de hacer scripts pero hace un par de años que no hago nada :( , si me dais unas pistias de por donde empezar seria fantastico
23 respuestas