Tengo el archivo de configuración como este en secciones
[rsync_includes] user data conf [rsync_exclude] tmp .pyc */vendor [javascript] utils dataTengo los patrones que quiero excluir en rsync y otros datos de configuración en ese archivo
Ahora estoy confundido, ¿cómo puedo usar esos patrones en la línea de comandos?
rsync -avz --exclude-from 'content from config file rsync exclude' source/ destination/No estoy seguro de cómo puedo leer parte del archivo de configuración y luego usarlo en la línea de comando
Para usar --exclude-from , deberá aislar la sección relevante de la configuración en un archivo temporal. Esto es fácil de hacer con un poco de sed:
tmp_file=$(mktemp) sed -n '1,/rsync_exclude/d;/\[/,$d;/^$/d;p' config.file > $tmp_file rsync -avz --exclude-from $tmp_file source/ destination/Estoy omitiendo la comprobación de errores y la limpieza para mayor claridad.
Tenga en cuenta que rsync puede leer el patrón de exclusión de la entrada estándar para una entrada - por lo que esto es aún más corto:
sed -n '1,/rsync_exclude/d;/\[/,$d;/^$/d;p' config.file | \ rsync -avz --exclude-from - source/ destination/Explicación
1,/rsync_exclude/d excluye todas las líneas hasta la entrada de la sección rsync_exclude/\[/,$d excluye todo, desde el inicio de la siguiente sección hasta el final del archivo/^$/d excluye líneas vacías (esto es opcional)Todo lo anterior extrae la sección relevante de la configuración.
Si su archivo de configuración está en config.ini , ejecute un script bash:
rm rsync-filter while IFS= read -r line do case "$line" in \[rsync_includes\]) command=include ;; \[rsync_exclude\]) command=exclude ;; \[*) command= ;; *) [ "$command" -a "$line" ] && echo "$command $line" >>rsync-filter esac done <config.iniDespués de que se ejecuta, crea un filtro rsync que contiene las reglas de inclusión y exclusión y se puede usar con rsync como:
rsync -avz --filter='merge rsync-filter' source/ destination/ Por separado, rsync ofrece la opción -F que es equivalente a --filter='dir-merge /.rsync-filter' . Esto carga las reglas de inclusión/exclusión del archivo /source/.rsync-filter y, además, a medida que rsync se adentra más en el árbol de directorios, buscará y cargará las reglas de los archivos .rsync-filter que encuentre y aplicará esas reglas a archivos en ese directorio y sus subdirectorios. Esta es una forma poderosa de mantener y organizar las reglas de rsync.
Además, el orden en que rsync lee las reglas de inclusión y exclusión es importante. Con estos archivos de filtro, conserva el control sobre ese pedido. Esa es una ventaja importante cuando intenta que las reglas de rsync funcionen correctamente.
Admito que no estoy familiarizado con rsync, pero yo mismo formatearía esos datos de manera diferente.
# rsync-data-file+.txt rsync-includes:user rsync-includes:data rsync-includes:conf rsync-exclude:tmp rsync-exclude:.pyc rsync-exclude:\*\/vendor javascript:utils javascript:dataA partir de ahí, puede hacer lo siguiente: -
#!/usr/bin/env bash set -x while read line do if [ $(echo "${line}" | sed -n '/rsync-includes/'p) ] then parameter=$(echo "${line}" | cut -d':' -f2) rsync "${parameter}" (other switches here etc) fi done < rsync-data-file+.txtDe esta manera, puede personalizar su línea de comando según el grupo al que pertenezca el parámetro; por lo tanto, con los parámetros del grupo javascript, puede registrar las operaciones en un archivo diferente, por ejemplo.