TL, DR:
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Rsync copia las fuentes en el destino. Si pasa *.pdf
como fuentes, el shell expande esto a la lista de archivos con la .pdf
extensión en el directorio actual. No ocurre un recorrido recursivo porque no pasó ningún directorio como fuente.
Por lo tanto, debe ejecutar rsync -a ~/LaTeX/ ~/Output/
, pero con un filtro para indicarle a rsync que .pdf
solo copie archivos. Las reglas de filtro de Rsync pueden parecer desalentadoras cuando lee el manual, pero puede construir muchos ejemplos con solo unas pocas reglas simples.
Inclusiones y exclusiones:
- Exclusión de archivos por nombre o por ubicación es fácil:
--exclude=*~
, --exclude=/some/relative/location
(en relación con el argumento de origen, por ejemplo, se incluyen las siguientes ~/LaTeX/some/relative/location
).
- Si solo desea hacer coincidir algunos archivos o ubicaciones, inclúyalos, incluya todos los directorios que conduzcan a ellos (por ejemplo, con
--include=*/
) y luego excluya el resto con --exclude='*'
. Esto es porque:
- Si excluye un directorio, esto excluye todo lo que está debajo de él. Los archivos excluidos no serán considerados en absoluto.
- Si incluye un directorio, esto no incluye automáticamente su contenido. En versiones recientes,
--include='directory/***'
lo haremos.
- Para cada archivo, se aplica la primera regla de coincidencia (y se incluye todo lo que nunca coincida).
Patrones:
- Si un patrón no contiene un
/
, se aplica al nombre del archivo sin directorio.
- Si un patrón termina con
/
, se aplica solo a los directorios.
- Si un patrón comienza con
/
, se aplica a toda la ruta desde el directorio que se pasó como argumento a rsync
.
*
cualquier subcadena de un solo componente de directorio (es decir, nunca coincide /
); **
coincide con cualquier subcadena de ruta.
Si un argumento fuente termina con a /
, su contenido se copia ( rsync -r a/ b
crea b/foo
para cada a/foo
). De lo contrario, el directorio en sí se copia ( rsync -r a b
crea b/a
).
Por lo tanto, aquí debemos incluir *.pdf
, incluir directorios que los contengan y excluir todo lo demás.
rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Tenga en cuenta que esto copia todos los directorios, incluso los que no contienen ningún archivo coincidente o subdirectorio que contenga uno. Esto se puede evitar con la --prune-empty-dirs
opción (no es una solución universal, ya que no puede copiar un directorio ni siquiera haciendo coincidirlo explícitamente, pero ese es un requisito poco frecuente).
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
**
patrón de zsh ) debería funcionar, sin embargo.