programing

재귀 적으로 scp를 사용하지만 일부 폴더는 제외

procenter 2021. 1. 15. 19:45
반응형

재귀 적으로 scp를 사용하지만 일부 폴더는 제외


이러한 구조를 가진 폴더가 있다고 가정합니다.

/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/
....

내가하고 싶은 scp것은 다음 폴더에

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

보시다시피 scp"fl_X"라는 이름의 모든 폴더를 제외하고 재귀 적으로 사용하고 싶습니다 . scp에는 그러한 옵션이없는 것 같습니다.

UPDATE scp에는 그러한 기능이 없습니다. 대신 다음 명령을 사용합니다.

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

하지만 작동하지 않습니다. 폴더 목록 만 전송 !! 뭔가ls -R


옵션으로 scp재귀 디렉토리 복사를 지원 하지만 -r파일 필터링은 지원하지 않습니다. 이 당신의 작업을 수행하는 방법에는 여러 가지가 있지만, 아마도에 의존하는 것 find, xargs, tar, 그리고 ssh대신 scp.

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

rsync솔루션은 작업을 할 수 있지만, 당신은 몇 가지 인수가 누락되었습니다. rsync또한 r하위 디렉터리로 재귀 하는 스위치가 필요합니다 . 또한에서 동일한 보안을 원하면 scp에서 전송해야합니다 ssh. 다음과 같은 것 :

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

가장 간단한 옵션 (원격 호스트에 rsync 설치)이 가능하지 않다고 가정하면 sshfs사용 하여 원격을 로컬로 마운트하고 마운트 디렉토리에서 rsync사용할 수 있습니다 . 이렇게하면 rsync가 제공하는 모든 옵션을 사용할 수 있습니다 (예 : --exclude.

다음과 같이해야합니다.

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

rsync의 효율성 (모든 것이 아닌 변경 사항 만 전송)은 여기에 적용되지 않습니다. 이것이 작동하려면 rsync가 변경된 내용을 확인하기 위해 모든 파일의 내용을 읽어야하기 때문입니다. 그러나 rsync는 하나의 호스트에서만 실행되므로 전체 파일을 sshfs로 전송해야합니다. 그러나 제외 된 파일은 전송해서는 안됩니다.


GLOBIGNORE를 내보내고 "*"를 사용할 수 있습니다.

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

pem 파일을 사용하여 인증하는 경우 다음 명령을 사용할 수 있습니다 (확장자가있는 파일 제외).

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>

-L은 링크를 따르는 것을 의미합니다 (링크가 아닌 파일 복사). 상대가 아닌 pem 파일의 전체 경로를 사용하십시오.

sshfs는 느리게 작동하므로 사용하지 않는 것이 좋습니다. 또한 위에 제시된 find와 scp의 조합은 너무 비싸서 파일 당 ssh 세션을 열기 때문에 나쁜 생각입니다.


You can use extended globbing as in the example below:

#Enable extglob
shopt -s extglob

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

This one works fine for me as the directories structure is not important for me.

scp -r USER@HOSTNAME:~/bench1/?cpu/p_?/image/ .

Assuming /bench1 is in the home directory of the current user. Also, change USER and HOSTNAME to the real values.

ReferenceURL : https://stackoverflow.com/questions/15121337/recursively-use-scp-but-excluding-some-folders

반응형