Cómo scp con expresiones regulares


13

Estoy tratando de copiar todos los archivos que no comienzan con la letra "a", en ksh.

La copia de la máquina de origen a la máquina de destino funciona bien :

scp -p !(a*) user@machine:/path/directory/.

Pero, si estoy en el servidor de destino y quiero copiar desde el servidor de origen, está fallando:

scp -p user@machine:/path/!(a*) .

¿Algunas ideas?

Respuestas:


17

Estoy de acuerdo con vonbrand. Gloging es manejado por el shell en el que se está ejecutando. Por scp user@machine:/path/*lo tanto , expandirá / ruta / * a los archivos en LOCAL / ruta / *, no en la máquina remota.

Sin embargo, solo por sonrisas intenté:

scp "user@machine:/path/[regex here]" .  

Y funcionó. Trata eso. Tenga en cuenta las citas. Muy necesario. Haznos saber.

Nota: la cuenta de usuario en la máquina remota puede tener un programa de shell diferente al tuyo , por lo que las reglas de expansión de comodines pueden ser diferentes, así que ten cuidado.


1

Esto no es "scp con expresiones regulares", el que maneja los globos de archivos es el shell. scpsimplemente recibe la lista de archivos ya expandida. Y la expansión ocurre en la máquina donde se ejecuta el comando.

Lo siento, no puedo (fácilmente) hacer.


Esta respuesta es incorrecta. Por favor, elimine :)
Michael

1

Lo que descubrí fue que en las máquinas HP-UX más antiguas (parisc 11.11), tenía que usar [^ a] * ¡Pero, en las máquinas más nuevas (parisc 11.31 y más nuevas) funciona! (A *)

Esto es con lo que terminé. Y funciona:

    if [[  ${S_MACH} = "phd026a" || ${S_MACH} = "tht030a" ]]
    then
            scp -p -r ${S_MACH}:${S_DIR}/bin/[^a^b^c^p]* ${D_DIR}/bin/.
    else
            scp -p -r ${S_MACH}:${S_DIR}/bin/!((a*)|(b*)|(c*)|(p*)) ${D_DIR}/bin/.
    fi

Ambas soluciones funcionan para mí en un servidor 11.11.
DarkHeart

0

Los nombres remotos pasados scpse interpretan realmente como una lista de patrones separados por espacios en blanco en el lado remoto. Esto suele ser una molestia cuando intentas copiar un archivo cuyo nombre contiene espacios, pero aquí es útil: scp -p 'user@machine:/path/a*' .copiaría todos los archivos cuyo nombre comienza con a.

Su comando funcionará si cita el patrón para que se interprete de forma remota en lugar de local, siempre que pase otro obstáculo. El patrón !(a*)no es un patrón de shell básico, es una extensión ksh (que bash y zsh también son compatibles si configura la opción adecuada). Así que esto sólo funcionará si su shell remoto es ksh, no si se trata de alguna otra concha y que exec ksha partir de .profileo algo similar.

La manera fácil, a menos que se encuentre en algún tipo de ambiente restringido o antiguo, es olvidarse de él scp. Desea que los archivos remotos funcionen igual que los archivos locales, así que conviértalos en archivos locales: monte el directorio remoto con sshfs . Esto requiere FUSE en la máquina local y un servidor SFTP (es decir, un sftp-serverejecutable que se sshdinicia) en la máquina remota.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.