Copiar selectivamente desde una colección de directorios remotos

Copiar selectivamente desde una colección de directorios remotos

Tengo una máquina remota con una gran cantidad de directorios numerados, así:

dir1 dir2 dir3 ... dir40

cada uno de los cuales contiene varios archivos numerados:

file1 file2 file3 ... file2530

Quiero copiar solo un rango seleccionado de archivos en cada directorio. Dado que los nombres de los archivos son idénticos en cada directorio, quiero volver a crear la jerarquía de directorios en mi máquina local. Pero como no quierocadaarchivo, no puedo usarlo simplemente scp -rpara copiar todos los archivos en el directorio.

No puedo configurar una conexión automatizada con claves ssh en la máquina remota, por lo que preferiría un método que no implique llamadas repetidas a un comando de copia remota. Los archivos también son grandes, por lo que no quiero simplemente copiarlo todo y eliminar los que no quiero rmy reforzar la expansión.

¿Cómo puedo copiar un conjunto de archivos desde una máquina remota, junto con los directorios principales de esos archivos, preservando al mismo tiempo la estructura del directorio y sin copiar todos los archivos en esos directorios?

Respuesta1

Puede usar rsync, que realizará solo un ssh al control remoto y le proporcionará una lista completa de archivos o una lista de patrones globales de archivos para copiar o no copiar. Por ejemplo,

rsync -navR --exclude='*-[4-9]?.out' --exclude='*-3[3-9].out' --exclude='*-???*.out' myremote:'dir*' mylocaldir

Esto excluiría nombres de archivos file-40.outcon 2 caracteres del 40 al 99, y también file-33.outal 39, y también file-100.outo mayores. Ejecute el comando con la -nopción como se muestra para recopilar la lista de nombres que se transferirán y, si está bien, elimine la opción para realizar la copia.

Tenga en cuenta rsyncque no admite llaves {}en sus patrones globales. Las formas alternativas de especificar los archivos a copiar dependen de cuán exótico sea su patrón de exclusión, pero un método infalible es usar -npatrones sin exclusión para obtener la lista completa de nombres, luego editar esta lista y proporcionarla como una --files-fromlista de archivos. También deberá eliminar el dir*del destino remoto:

rsync -av --files-from=list  myremote: mylocaldir

información relacionada