¿Cómo haría para excluir todos los directorios excepto ciertos y un tipo de archivo en rsync?

¿Cómo haría para excluir todos los directorios excepto ciertos y un tipo de archivo en rsync?

Para un proyecto de PNL necesito una copia de la biblioteca del Proyecto Gutenberg. Ahora, el proyecto permite la descarga de sus archivos, especialmente si es para fines de duplicación (estoy planeando configurar uno eventualmente), pero para mi trabajo solo necesito un subconjunto específico de los archivos presentes.

Los directorios en la fuente están organizados así:

|
| - 1 - |
|       |- 1
|       |- 2
|       |...
| - 2
| .
| .
| .
| - 9
| - cache
| - retired
| ...

Los únicos directorios que me interesan son los numerados, y el único tipo de archivo que me interesa es .txt. Tampoco quiero archivos que terminen en -8.txto -h.txt, pero estoy dispuesto a tolerarlos por ahora.

Hasta ahora lo he probado:

  • --include "*/" --include "*.txt" --exclude "cache" --exclude "images" --exclude "retired" --exclude "pg" --exclude "*-8.txt" --exclude "*"<- este todavía se encuentra en la carpeta "caché", ya que también contiene algunos .txtarchivos
  • --include "*/" --include "*.txt" -f'- *\-8.txt' -f'- *\-h.txt' -f'- cache/**' --exclude "cache" --exclude "images" --exclude "retired" --exclude "pg" --exclude "*"<- más o menos lo mismo

El problema parece ser el siguiente:

  • necesito excluirtodo, ya que hay un conjunto extremadamente limitado de cosas que necesito
  • Incluyo los directorios numerados, ya que eso es todo lo que necesito.
  • La inclusión *.txtrompe las exclusiones anteriores, porque otros directorios también contienen archivos de texto.

¿Cómo haría esto?

Respuesta1

De la publicación rsync: excluye todos los directorios excepto unos pocos, cito del respuesta de Darryl E. Clarke:

Un simple filtro debería funcionar. Para aprovechar la respuesta anterior con un ejemplo adecuado: incluya explícitamente los archivos principales, además de todas las subcarpetas y archivos (**). Luego excluya todo lo demás. Aquí está filter.txt:

+ /include_this_dir/
+ /include_this_dir/**
+ /include_that_dir/
+ /include_that_dir/**
- /** With the command line:

rsync -av --dry-run --filter="merge filter.txt" source_dir/ dest_dir/

Resultaría en:

sending incremental file list
created directory dest_dir
./
include_that_dir/
include_that_dir/somefile.txt
include_that_dir/subdir/
include_this_dir/

sent 202 bytes  received 65 bytes  534.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Añade a esto tu filtro de *.txt.

En otras palabras: primero incluya, luego excluya todo.

Respuesta2

Podrías hacer coincidir explícitamente los directorios numerados con el globo [0-9]/:

 -f'+ [0-9]/' \
 -f'- *-[8h].txt' \
 -f'+ *.txt' \
 -f'- *' \

Si los números son superiores a 9, quizás también sea suficiente sumar -f'+ [0-9][0-9]/o .-f'+ [0-9]*/

información relacionada