GNU/Linux >> Tutoriales Linux >  >> Linux

Filtro Rsync:¿Copiar un solo patrón?

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ó).
  • 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 a rsync .
    • * cualquier subcadena de un solo componente de directorio (es decir, nunca coincide con / ); ** coincide con cualquier subcadena de ruta.
  • Si un argumento fuente termina con un / , su contenido se copia (rsync -r a/ b crea b/foo por cada a/foo ). De lo contrario, se copia el directorio en sí (rsync -r a b crea b/a ).

Relacionado:¿Cuándo usaría un descriptor de archivo adicional?

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/

Linux
  1. ¿Cómo ingresar a un directorio cuyo nombre es solo un signo negativo?

  2. ¿Cómo asegurarse de que solo se ejecute una instancia de un script Bash?

  3. Sed:¿Imprimir solo la primera aparición de una coincidencia de patrón?

  4. ¿Registrar solo archivos transferidos con Rsync?

  5. ¿Rsync está cambiando los permisos del directorio?

Cómo usar Rsync

Ejemplos de comandos rsync de Linux

Barras y el comando rsync

rsync N archivos más nuevos en un directorio

¿Qué sucede si se interrumpe mv?

Rsync copiando el directorio actual con nombre