Estoy tratando de crear un directorio que contenga todos y solo mis archivos PDF compilados de LaTeX. Me gusta mantener cada proyecto en una carpeta separada, todos alojados en una carpeta grande llamada LaTeX
. Así que intenté ejecutar:
rsync -avn *.pdf ~/LaTeX/ ~/Output/
que debería encontrar todos los archivos PDF en ~/LaTeX/
y transfiéralos a la carpeta de salida. Esto no funciona. Me dice que no encontró coincidencias para “*.pdf
“. Si dejo fuera este filtro, el comando lista todos los archivos en todas las carpetas del proyecto bajo LaTeX. Entonces es un problema con el filtro *.pdf. Intenté reemplazar ~/
con la ruta completa a mi directorio de inicio, pero eso no tuvo ningún efecto.
Estoy, usando zsh. Intenté hacer lo mismo en bash e incluso con el filtro que enumeró cada archivo en cada subdirectorio... ¿Qué está pasando aquí?
¿Por qué rsync no comprende mi filtro de solo pdf?
ESTÁ BIEN. Así que actualiza:No, lo estoy intentando
rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/
Y esto me da la lista completa de archivos. Supongo que porque todo coincide con el primer patrón...
Respuesta aceptada:
TL,DR:
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Rsync copia la(s) fuente(s) al destino. Si pasa *.pdf
como fuentes, el shell expande esto a la lista de archivos con el .pdf
extensión en el directorio actual. No ocurre un recorrido recursivo porque no pasó ningún directorio como fuente.
Entonces necesita ejecutar rsync -a ~/LaTeX/ ~/Output/
, pero con un filtro para decirle a rsync que copie .pdf
solo archivos. Las reglas de filtro de Rsync pueden parecer abrumadoras cuando lees el manual, pero puedes construir muchos ejemplos con solo unas pocas reglas simples.
-
Inclusiones y exclusiones:
- Excluir archivos por nombre o ubicación es fácil:
--exclude=*~
,--exclude=/some/relative/location
(relativo al argumento fuente, por ejemplo, esto excluye~/LaTeX/some/relative/location
). - Si solo desea hacer coincidir algunos archivos o ubicaciones, inclúyalos, incluya todos los directorios que conducen a ellos (por ejemplo con
--include=*/
), luego excluya el resto con--exclude='*'
. Esto se debe a que: - Si excluye un directorio, esto excluye todo lo que está debajo de él. Los archivos excluidos no se tendrán en cuenta en absoluto.
- Si incluye un directorio, este no incluye automáticamente su contenido. En versiones recientes,
--include='directory/***'
hará eso. - Para cada archivo, se aplica la primera regla de coincidencia (y se incluye todo lo que nunca coincidió).
- Excluir archivos por nombre o ubicación es fácil:
-
Patrones:
- Si un patrón no contiene un
/
, se aplica al nombre de archivo sin directorio. - Si un patrón termina con
/
, solo se aplica a los directorios. - Si un patrón comienza con
/
, se aplica a toda la ruta desde el directorio que se pasó como argumento arsync
. *
cualquier subcadena de un solo componente de directorio (es decir, nunca coincide con/
);**
coincide con cualquier subcadena de ruta.
- Si un patrón no contiene un
-
Si un argumento fuente termina con un
/
, su contenido se copia (rsync -r a/ b
creab/foo
por cadaa/foo
). De lo contrario, se copia el directorio en sí (rsync -r a b
creab/a
).
Por lo tanto, aquí debemos incluir *.pdf
, incluya directorios que los contengan y excluya 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 un archivo coincidente o un subdirectorio que contenga uno. Esto se puede evitar con --prune-empty-dirs
opción (no es una solución universal, ya que entonces no puede copiar un directorio ni siquiera haciéndolo coincidir explícitamente, pero ese es un requisito poco frecuente).
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/