2010-11-29 19 views
7

Estamos ejecutando Subversion en un servidor Linux. Alguien en nuestra organización sobrescribió aproximadamente 3k archivos con mayúsculas y minúsculas cuando todos necesitan ser minúsculas.¿Cómo puedo cambiar el nombre de los archivos por lotes en minúsculas en Subversion?

Esto funciona de la CLI

rename 'y/A-Z/a-z/' * 

Pero obviamente arruine la subversión.

svn rename 'y/A-Z/a-z/' * 

No funciona porque la subversión trata de cambiar el nombre de manera diferente, supongo. Entonces, ¿cómo puedo hacer esto como un trabajo por lotes? Aspiro con CLI, así que por favor explícalo como si fuera tu padre. renombrar manualmente todos los archivos 3k no es una tarea que desee emprender.

Gracias

+0

Espero que la historia no sea un problema. Lo has perdido todo y perderás todo después del cambio de nombre. – jgifford25

+0

Gracias por la preocupación, pero la historia no es un problema, es un volcado de archivos html de un proveedor externo que simplemente reemplazamos trimestralmente de todos modos. – invertedSpear

Respuesta

7
for src in *; do 
    dst=$(echo "$src" | tr '[A-Z]' '[a-z]') 
    [ "$src" = "$dst ] || svn rename "$src" "$dst" 
done 

como funciona:

  1. bucle sobre fuente de nombres de archivo.
  2. El nombre de archivo de destino es el nombre de archivo en minúscula. tr hace traducciones de personaje a personaje.
  3. Si los nombres de los archivos de origen y destino son los mismos, estamos de acuerdo, de lo contrario, svn rename. En su lugar, podría usar una instrucción if, pero para conditional de una línea usando || es bastante común.

Si necesita recursividad, se puede crear un pequeño script svn-lowername.sh (una ligera variante del anterior):

#!/bin/bash 
for src; do 
    dst=$(echo "$src" | tr '[A-Z]' '[a-z]') 
    [ "$src" = "$dst" ] || svn rename "$src" "$dst" 
done 

Asegúrese de chmod +x svn-lowername.sh. A continuación, ejecutar:

find -name .svn -prune -o -type f -print0 | xargs -0 ./svn-lowername.sh 

Si cree que este problema podría suceder de nuevo, escondite svn-lowername.sh en su camino de alguna parte (~/bin/ podría ser un buen lugar) y, a continuación, puede perder el prefijo ./ cuando se ejecuta.

También puede utilizar svn-lowername.sh en un solo directorio de esta manera:

./svn-lowername.sh * 
+0

El '*' no se repetirá a través de subdirectorios, pero hará lo que haga el primer ejemplo de @ invertedSpear. Probablemente quiera 'encontrar. .' o similar. – nmichaels

+0

@Nathon: sí, no agregué recursividad porque el ejemplo "esto funciona" no fue recursivo. –

+0

Gracias, tiene razón, la recursividad no es necesaria, pero gracias por proporcionarla. – invertedSpear

1

Esto es un poco hacky, pero debe trabajar en cualquier número de directorios anidados:

find -mindepth 1 -name .svn -prune -o -print | (
    while read file; do 
     svn mv "$file" "`perl -e 'print lc(shift)' "$file"`" 
    done 
) 

Además, podría simplemente revertir su compromiso. Administrar la pista por cuatro puede ser prudente.

+0

no puede revertir su confirmación de cau se fue un volcado en la actualización de un proveedor externo. entonces los priores son documentos desactualizados. Ah, y amigo, también renuncias, por lo tanto tengo que arreglarlo ahora. – invertedSpear

+1

Esto es mejor porque no depende de que el shell expanda '*' en todos los archivos del directorio. Eso puede sobrecargar la línea de comando sin previo aviso. Sí, las líneas de comando son muy grandes, pero cuando sucede, le quedan un conjunto de archivos parcialmente renombrado y no se advierte que el comando no completó la tarea asignada. –

1

Los renombrados en Subversion requieren dos pasos, un svn copy seguido de un svn delete si desea conservar el historial. Si usa svn move, perderá el historial del archivo.

Si bien esta respuesta no ayuda con su pregunta, ayudará a evitar que esto suceda nuevamente. Implemente el script case-insenstive.py en su enlace precompromiso en su repositorio de Subversion. La próxima vez que alguien intente agregar un archivo con un caso diferente, el enlace pre-commit no se lo permitirá.

Cuestiones relacionadas