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 wget
los 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.css
se 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 -maxdepth
valor "1" para que el proceso no se salga de control en su sistema de archivos y utiliza una echo
versió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 1
a algo como -maxdepth 9
o incluso eliminarlo por completo y luego comentar la echo
línea y descomentar la mv
lí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 mv
comando 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.css
y 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 rename
herramienta 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 $newf
con echo $f $nf
y asegurarte de que hace lo que deseas.