
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 -r
para 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 rm
y 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.out
con 2 caracteres del 40 al 99, y también file-33.out
al 39, y también file-100.out
o mayores. Ejecute el comando con la -n
opció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 rsync
que 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 -n
patrones sin exclusión para obtener la lista completa de nombres, luego editar esta lista y proporcionarla como una --files-from
lista de archivos. También deberá eliminar el dir*
del destino remoto:
rsync -av --files-from=list myremote: mylocaldir