› Foros › PC › Software libre
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...
$ find /path/ -exec rename 'y/áéíóú/aeiou/' '{}' \;
#!/bin/sh
NUEVONOMBRE=$(echo "$*" | tr "áéíóú" "aeiou")
mv "$*" "$NUEVONOMBRE"
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.
find /ftp/
find /ftp/ -exec comando '{}' \;
find /ftp/ -exec rm '{}' \;
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:
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.
A ver si alguien me puede AUXILIAR
Qué graciosillo, el nene.
Escrito originalmente por musikal
Pues no termina de cuajar la cosa.
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.
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.
.:
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
$ 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
.:
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
$ 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
$ 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...
#!/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
# 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.
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.
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 ). Luego ya he espabilado (aprendo rápido) y lo he hecho con unos directorios de prueba y sin problemas
///gc es interactivo y pregunta por una confirmación. s///g no es interactivo
^ Inicio de una línea
$ Final de una línea
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/'
CambiadoPor 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.
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.
nombrebase=${1##*/}
path=${1%$nombrebase}
nombre=${1%/}
nombrebase=${nombre##*/}
path=${nombre%"$nombrebase"}
$ 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"}