Comment scp avec des expressions régulières

13

J'essaie de copier tous les fichiers qui ne commencent pas par la lettre "a", en ksh.

La copie de la machine source vers la machine de destination fonctionne correctement :

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

Mais, si je suis sur le serveur de destination et que je souhaite copier à partir du serveur source, échoue:

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

Des idées?

Ryan P
la source

Réponses:

17

Je suis d'accord avec vonbrand. Le globing est géré par le shell dans lequel vous exécutez. Ainsi scp user@machine:/path/*, vous développerez / path / * vers les fichiers dans LOCAL / path / *, pas sur la machine distante.

Cependant, juste pour les sourires, j'ai essayé:

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

et .... cela a fonctionné. Essayez ça. Notez les citations. Très nécessaire. Faites le nous savoir.

Remarque: le compte d'utilisateur sur la machine distante peut être par défaut un programme shell différent du vôtre , donc les règles d'expansion des caractères génériques peuvent être différentes, donc 'Ware that.

SuperMagic
la source
1

Ce n'est pas "scp avec des expressions régulières", celui qui gère les globes de fichiers est le shell. scpreçoit juste la liste déjà étendue des fichiers. Et l'expansion se produit sur la machine où la commande est exécutée.

Désolé, je ne peux pas (facilement) le faire.

vonbrand
la source
Cette réponse est fausse. Veuillez retirer :)
Michael
1

Ce que j'ai trouvé, c'est que sur les anciennes machines HP-UX (parisc 11.11), je devais utiliser [^ a] * Mais, sur les machines plus récentes (parisc 11.31 et plus récentes), cela fonctionne! (A *)

C'est ce avec quoi je me suis retrouvé. Et il fonctionne:

    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
Ryan P
la source
Les deux solutions fonctionnent pour moi sur un serveur 11.11.
DarkHeart
0

Les noms distants passés à scpsont en fait interprétés comme une liste de motifs séparés par des espaces du côté distant. C'est souvent une gêne lorsque vous essayez de copier un fichier dont le nom contient des espaces, mais ici c'est utile: scp -p 'user@machine:/path/a*' .copierait tous les fichiers dont le nom commence par a.

Votre commande fonctionnera si vous citez le modèle afin qu'il soit interprété à distance plutôt que localement, à condition de franchir un autre obstacle. Le modèle !(a*)n'est pas un modèle de shell de base, c'est une extension ksh (que bash et zsh prennent également en charge si vous définissez l'option appropriée). Donc , cela ne fonctionnera que si votre shell distant est ksh, pas si elle est une autre shell et vous exec kshde .profileou quelque chose de similaire.

Le moyen le plus simple, à moins que vous ne soyez dans une sorte d'environnement restreint ou antique, est d'oublier scp. Vous souhaitez que les fichiers distants fonctionnent comme les fichiers locaux, alors faites-en des fichiers locaux: montez le répertoire distant avec sshfs . Cela nécessite FUSE sur la machine locale et un serveur SFTP (c'est-à-dire un sftp-serverexécutable qui se sshdlance) sur la machine distante.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
Gilles 'SO- arrête d'être méchant'
la source