Estoy tratando de determinar el tamaño de los archivos que se copiarían nuevamente al sincronizar dos carpetas ejecutando rsync en modo seco y luego resumiendo los tamaños de los archivos enumerados en la salida de rsync.
Actualmente estoy atascado en el prefijo de los archivos por su carpeta principal. Descubrí cómo prefijar líneas usando sed y cómo escapar usando sed, pero tengo problemas para combinar esos dos.
Así de lejos llegué:
source="/my/source/folder/"
target="/my/target/folder/"
escaped=`echo "$source" | sed -e 's/[\/&]/\\//g'`
du `rsync -ahnv $source $target | tail -n +2 | head -n -3 | sed "s/^/$escaped/"` | awk '{i+=$1} END {print i}'
Este es el resultado que obtengo de bash -x myscript.sh
+ source=/my/source/folder/
+ target=/my/target/folder
++ echo /my/source/folder/
++ sed -e 's/[\/&]/\//g'
+ escaped=/my/source/folder/
+ awk '{i+=$1} END {print i}'
++ rsync -ahnv /my/source/folder/ /my/target/folder/
++ sed 's/^//my/source/folder//'
++ head -n -3
++ tail -n +2
sed: -e expression #1, char 8: unknown option to `s'
+ du
80268
Cualquier idea sobre cómo escapar adecuadamente sería muy apreciada.
Si está intentando contar los datos, es probable que desee omitir cualquier subdirectorio posible. Esto puede no ser aplicable, pero siempre es mejor evitar cualquier rareza. Aquí está mi directorio fuente. Todos estos archivos se crearon con tacto, por lo que ocupan 0 espacios.
No debería necesitar escapar en ningún lugar tan cerca como lo está haciendo. El bloque sed aquí hará lo siguiente:
1d; elimine la primera línea de 'envío de la lista de archivos incrementales'
/ ^ $ /, $ d; elimine la línea en blanco que significa el final de la lista de archivos y todo lo que sigue.
// $ / d borra cualquier línea que termine en '/', que serían los directorios
Tenga en cuenta que puede escapar de las barras inclinadas diagonales (para responder la pregunta real).
Y para obtener puntos de bonificación adicionales, incluso puede sumar los resultados:
Sin embargo, si está haciendo esto con el directorio ya totalmente sincronizado, obtendrá resultados divertidos:
fuente