
Tengo una estructura de carpetas que ha sido (mal) mantenida por varios trabajos automatizados. Uno de los efectos secundarios de estos trabajos parece ser que crea nombres de carpetas duplicados (y posteriormente imágenes duplicadas).
Tengo alrededor de 50 GB de imágenes alojadas en este servidor y una estimación conservadora sugiere que al menos el 10% de ellas están duplicadas. Estoy en el proceso de migrar a una infraestructura nueva y me gustaría deduplicar los archivos y carpetas.
Dada una estructura de directorio de la siguiente manera
images/New_Site/Food
images/New_Site/Food/Content
images/New_Site/Food/Content/Content
images/New_Site/Food/Content/Waterfall
images/New_Site/Food/Food
images/New_Site/Food/Food/Content
images/New_Site/Food/Food/Recipes
images/New_Site/Food/Recipes
images/New_Site/Food/Recipes/Recipes
images/New_Site/Home
images/New_Site/Home/Home
images/New_Site/Kids
images/New_Site/Kids/Kids
images/New_Site/Men
images/New_Site/Men/Men
images/New_Site/New_Site
images/New_Site/New_Site/Baby
images/New_Site/New_Site/Beauty
images/New_Site/New_Site/Corporate
images/New_Site/New_Site/Corporate/About
images/New_Site/New_Site/Corporate/Careers
images/New_Site/New_Site/Corporate/Education
images/New_Site/New_Site/Corporate/Legal
images/New_Site/New_Site/Food
Quiero generar un script que solo copie las siguientes carpetas (sin recursividad)
images/New_Site/Food
images/New_Site/Food/Content
images/New_Site/Food/Content/Waterfall
images/New_Site/Food/Recipes
images/New_Site/Home
images/New_Site/Kids
images/New_Site/Men
Hay más de 2200 carpetas en la estructura duplicada actual, por lo que limpiarla manualmente no es un proceso repetible eficiente.
Para complicar las cosas, necesito migrar los elementos deduplicados de AIX a un entorno Windows 2012 R2. Puedo usar Putty SCP para copiar archivos entre servidores o puedo crear un archivo zip (aunque con 50 Gb, no estoy seguro si el archivo es una buena idea).
Mi enfoque sería buscar todas las carpetas, eliminar cualquier carpeta que tenga un nombre duplicado inmediatamente después del nombre anterior usando '/' como delimitador. Entonces, lógicamente, puedo resolverlo, pero no puedo traducirlo en algún tipo de comando grep. Cualquier ayuda es muy apreciada.
Respuesta1
No es grep, pero aquí hay un script bash que debería brindarte lo que deseas:
#!/bin/bash
srcdir=$1
destdir=$2
subdir=${3:-$destdir}
depth=$((${4:-0} + 1))
srcdirbase=${srcdir##*/}
for subdirdir in $srcdir/*/
do
fixdir=${subdirdir%*/}
fixbase=${fixdir##*/}
if [ "$fixbase" != "*" -a "$fixbase" != "$srcdirbase" ]; then
newsubdir=$subdir/$fixbase
echo -e "mkdir \"$newsubdir\" && cp \"$fixdir/*\" \"$newsubdir\""
if [ $depth -lt 20 ]; then
./$0 "$fixdir" "$destdir" "$newsubdir" $depth
fi
fi
done
Si le pones un nombre snowflake.sh
, puedes llamarlo así:
(echo "#\!$SHELL"; ./snowflake.sh <source_dir> <dest_dir>) > bugfix.sh
Reemplazando <source_dir>
y <dest_dir>
con los caminos reales que tienes.
Respuesta2
¿Qué tal usar esto?
grep --invert-match '/(.+)/\1'
O para que coincida con su caso de prueba modificado
grep --invert-match '(.+)/\1'