Cambiar el nombre de los archivos obtenidos a través de “wget --mirror” en Bash antes de cargarlos en un área alojada estáticamente de Amazon S3

Cambiar el nombre de los archivos obtenidos a través de “wget --mirror” en Bash antes de cargarlos en un área alojada estáticamente de Amazon S3

Estoy intentando archivar y cargar un sitio web antiguo en un área alojada estáticamente de Amazon S3.

Pude obtener el contenido con wget, usando el siguiente comando:

wget --mirror --no-parent --html-extension --page-requisites http://original.com

Luego, podría reemplazar todos los enlaces a su nueva URL por:

ag -l original\.com -0 | xargs -0 sed -i '' \
's|original.com|old.original.com|g'

Después de esto, subí el sitio web a Amazon S3 usando s3cmd sync.

Mi único problema ahora es que a todos los activos "rompidos en caché" ahora se les niega el acceso en Amazon. El problema es que wgetlos archivos con parámetros de consulta están incluidos en su nombre y tendré que cambiarles el nombre.

Entonces me gustaría cambiar el nombre de los archivos de forma recursiva, en todas las subcarpetas, como:

  • style.css?ver=4.2.5.cssse renombra astyle.css

¿Cómo puedo hacer eso en Mac OS X usando Bash 3.2?

Respuesta1

Esto debería funcionar:

find . -maxdepth 1 -type f -name '*\?*' |\
  while read FILENAME
  do
    IFS='?'
    SPLIT_FILENAME=(${FILENAME})
    unset IFS
    echo mv "${FILENAME}" "${SPLIT_FILENAME}"
    # mv "${FILENAME}" "${SPLIT_FILENAME}"
  done

Indica find .que toda la acción ocurre en el directorio actual, así como en los directorios secundarios; siéntase libre de cambiarla .para que sea la ruta de archivo completa/real de lo que está actuando. Busca -name '*\?*'archivos con un signo de interrogación ( ?) en su nombre.

Esta versión inicial/demo también tiene un -maxdepthvalor "1" para que el proceso no se salga de control en su sistema de archivos y utiliza una echoversión del comando para mostrarle lo que haría antes de ejecutarlo de verdad.

Si ejecuta eso y el resultado se ve bien, siéntase libre de ajustarlo -maxdepth 1a algo como -maxdepth 9o incluso eliminarlo por completo y luego comentar la echolínea y descomentar la mvlínea para que se vea así:

find . -type f -name '*\?*' |\
  while read FILENAME
  do
    IFS='?'
    SPLIT_FILENAME=(${FILENAME})
    unset IFS
    # echo mv "${FILENAME}" "${SPLIT_FILENAME}"
    mv "${FILENAME}" "${SPLIT_FILENAME}"
  done

Usando su ejemplo de archivo de prueba style.css?ver=4.2.5.css, obtuve este resultado al ejecutar este script en mi sistema Mac OS X 10.9.5 (Mavericks):

mv ./style.css?ver=4.2.5.css ./style.css

Me parece un buen cambio. Lo ejecuté con el mvcomando real y se cambió exitosamente el nombre del archivo a style.css. Esto también funcionaría con archivos que tienen espacios, como archivos de prueba como this is my style.css?ver=4.2.5.cssy my style.css?ver=4.2.5.css.

Respuesta2

Esto funcionaría en Mac OS X suponiendo que solo haya uno ?en la URL/nombre de archivo original:

find . -name "*\?*" -exec sh -c 'var="{}" ; mv "{}" "${var%\?*}"' \;

Como referencia, esto funcionaría también en sistemas Linux (o cualquier sistema) que tenga la renameherramienta instalada:

find . -name "*\?*" -exec rename "s/\?.*//" "{}" \;

Respuesta3

Usaré echo para demostrarlo.

# echo 'style.css?ver=4.2.5.css' | cut -d? -f2-9999
ver=4.2.5.css

Recursión:

cd <yourdir>
for f in *; do
    newf=$( echo $f | cut -d? -f2-9999 )
    mv $f $newf
done

Supuestos: <yourdir>contiene sólo archivos que desea modificar. De lo contrario, modifique el for f in *globo para adaptarlo. Primero debes probar el comando final con echo, es decir, reemplazarlo mv $f $newfcon echo $f $nfy asegurarte de que hace lo que deseas.

información relacionada