Estoy trabajando en una conversión de sitio web. Los archivos, ya que estaban vinculados y servidos desde el servidor web, no distinguen entre mayúsculas y minúsculas. Pero hice un volcado del sitio en mi sistema Linux y estoy escribiendo scripts para migrar datos. El problema es que me encuentro con problemas de mayúsculas y minúsculas entre las cadenas de enlaces en las páginas y el caso real de palabras en el sistema de archivos.
Por ejemplo, una página puede tener un enlace como <a href='/subfolder/PageName.asp'>
mientras el archivo real es /subfolder/pagename.asp
. Del mismo modo con las imágenes, <img src='spacer_sm.gif'>
podría ser Spacer_Sm.gif
.
Entonces, mi idea es cambiar todos los directorios y nombres de archivos a sus equivalentes en minúsculas para la descarga del sitio. ¿Cómo hago esto (y podría haber una mejor manera?)
Incluso si hay comandos unix que tienen conmutadores que no distinguen entre mayúsculas y minúsculas, estoy usando php, por lo que no todos los comandos del sistema de archivos tienen opciones para la distinción entre mayúsculas y minúsculas.
fuente
Respuestas:
No sé si tu sabor unix tiene un
rename
. Muchas Linux tienen, y es parte de un paquete perl, si busca un repositorio.Versión anterior con
en realidad no realiza la acción, sino que solo imprime lo que se haría. Omite el -n para hacerlo de verdad.
fuente
'y/[A-Z]/[a-z]/'
parte?rename
es parte de unperl
paquete, supongo que perl, pero el patrón también se usased
, y tal vezAWK
también. Solo sésed
callar bien. Traduzcoy
atranslate
omap
, pero no sé dónde están los orígenes del personaje.rename
es un guión perl.Zsh
Explicaciones:
zmv
cambia el nombre de los archivos que coinciden con un patrón de acuerdo con el texto de reemplazo dado.-o-i
pasa la-i
opción a cadamv
comando debajo del capó (ver más abajo). En el texto de reemplazo,$1
,$2
, etc, son los grupos sucesivos entre paréntesis en el patrón.**
significa todos los directorios (sub) *, recursivamente. El final(/)
no es un grupo entre paréntesis, sino un calificador global que significa que solo coinciden con los directorios.${2:l}
Convierte$2
a minúsculas.Perl renombrar
Aquí uso el script de cambio de nombre de Perl que Debian y Ubuntu incluyen
/usr/bin/prename
(también disponible normalmenterename
). Con bash ≥4 o zsh:Con otras conchas:
Portátil
Recursivamente:
El uso de
-depth
asegura que los directorios profundamente anidados se procesen antes que sus antepasados.fuente
No funcionó en la siguiente estructura de directorios:
Aquí hay un ejemplo que funciona:
Para una explicación sobre
b
ye
vars:Luego use la siguiente secuencia de teclas: /,,Enterbb
fuente
La respuesta aceptada no funcionó para mí, ya que trató de cambiar todos los directorios a la vez. Encontré otra solución en stackexchange muy similar a la portátil de Gilles arriba: de Baramin -
/programming/4268591/unix-rename-files-directories-to-uppercase
Lo he copiado aquí:
A lo que cambié el comando tr a ie: sed s / cat / dog / g
Cualquier agradecimiento va a Baramin en el enlace de arriba.
fuente