Vraag recpulief scp gebruiken maar sommige mappen uitsluiten


Stel dat er enkele mappen met deze structuren zijn

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_1/image/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_1/image/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
....

Wat ik wil doen is scp de volgende mappen

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_1/image/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_1/image/

Zoals je kunt zien wil ik recursief gebruiken scp maar exclusief alle mappen met de naam "fl_X". Het lijkt erop dat scp niet zo'n optie heeft.

BIJWERKEN scp heeft niet zo'n functie. In plaats daarvan gebruik ik de volgende opdracht

 rsync -av --exclude 'fl_*' user@server:/my/dir

Maar het werkt niet. Het draagt ​​alleen de lijst met mappen over !! zoiets als ls -R


34
2018-02-27 20:06


oorsprong


antwoorden:


Hoewel scp ondersteunt recursieve directory-kopie met de -r optie ondersteunt het filteren van de bestanden niet. Er zijn verschillende manieren om je taak te volbrengen, maar ik zou er waarschijnlijk op vertrouwen find, xargs, tar, en ssh in plaats van scp.

find . -type d -wholename '*bench*/image' \
| xargs tar cf - \
| ssh user@remote tar xf - -C /my/dir

De rsync oplossing kan worden gemaakt om te werken, maar u mist enkele argumenten. rsync heeft ook de r schakel over naar recurse in subdirectories. Ook als u dezelfde beveiliging van wilt scp, je moet de overdracht doen onder ssh. Zoiets als:

rsync -avr -e "ssh -l user" --exclude 'fl_*' ./bench* remote:/my/dir

31
2018-02-27 23:34



Ervan uitgaande dat de eenvoudigste optie (het installeren van rsync op de externe host) niet haalbaar is, kunt u gebruiken sshfs om de afstandsbediening lokaal te koppelen, en rsync uit de mount-map. Op die manier kunt u alle opties gebruiken die rsync biedt, bijvoorbeeld --exclude.

Iets dergelijks zou moeten doen:

sshfs user@server: sshfsdir
rsync --recursive --exclude=whatever sshfsdir/path/on/server /where/to/store

Merk op dat de effectiviteit van rsync (alleen het overdragen van wijzigingen, niet alles) hier niet van toepassing is. Dit komt omdat voor dat om te werken, rsync de inhoud van elk bestand moet lezen om te zien wat er is veranderd. Omdat rsync echter alleen op één host draait, moet het hele bestand daar naartoe worden verplaatst (door sshfs). Uitgesloten bestanden mogen echter niet worden overgedragen.


9
2018-04-28 14:16



U kunt een GLOBIGNORE exporteren en "*" gebruiken

export GLOBIGNORE='ignore1:ignore2'
scp -r source/* remoteurl:remoteDir

3
2018-05-02 11:22



Als u een pem-bestand gebruikt om te verifiëren, kunt u de volgende opdracht gebruiken (waardoor bestanden met een extensie worden uitgesloten):

rsync -Lavz -e "ssh -i <full-path-to-pem> -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --exclude "*.something" --progress <path inside local host> <user>@<host>:<path inside remote host>

De -L betekent volg links (kopie bestanden niet links). Gebruik het volledige pad naar uw pem-bestand en niet naar het relatieve.

Het gebruik van sshf's wordt niet aanbevolen, omdat het langzaam werkt. Ook is de combinatie van find en scp die hierboven werd gepresenteerd ook een slecht idee, omdat het een ssh-sessie per bestand opent die te duur is.


1
2017-08-17 04:04



U kunt uitgebreide globbing gebruiken zoals in het onderstaande voorbeeld:

#Enable extglob
shopt -s extglob

cp -rv !(./excludeme/*.jpg) /var/destination

0
2018-03-11 16:02