Programing

scp를 사용하여 dir을 재귀 적으로 복사 할 때 파일을 필터링하는 방법은 무엇입니까?

lottogame 2020. 8. 29. 11:51
반응형

scp를 사용하여 dir을 재귀 적으로 복사 할 때 파일을 필터링하는 방법은 무엇입니까?


모든 .class 파일을 서버에서 로컬로 모든 디렉토리가 예약 된 상태로 복사해야합니다. 예를 들어이 server:/usr/some/unknown/number/of/sub/folders/me.class될 것입니다 /usr/project/backup/some/unknown/number/of/sub/folders/me.class내가 원하는하지 않는 등을 .svn베이스 파일과 같은 다른 많은 쓸모없는 파일이 있습니다 문제입니다. scp.class 파일 만 필터링하려면 어떻게해야 합니까?


아마 같은 것을 사용하는 것이 좋습니다 거라고 rsync는이 때문에 위해를 include하고 exclude, 플래그 예를 -

rsync -rav -e ssh --include '*/' --include='*.class' --exclude='*' \
server:/usr/some/unknown/number/of/sub/folders/ \ 
/usr/project/backup/some/unknown/number/of/sub/folders/

기타 유용한 플래그 :

  • -r 재귀 용
  • -a 아카이브 용 (대부분 모든 파일)
  • -v 자세한 출력
  • -e 기본값 대신 ssh를 지정하려면 (실제로는 ssh 여야 함)

기본 디렉토리에서 도트 파일을 제외하려면 :

scp -r [!.]* server:/path/to/something

[!.]* 점으로 시작하지 않는 작업 디렉토리의 모든 파일로 확장되는 쉘 glob입니다.


scp에는 파일을 필터링하는 기능이 없습니다. 이와 같은 "고급"항목의 경우 rsync를 사용하는 것이 좋습니다.

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

(이 줄은 먼 폴더에서 현재 폴더로 rsync를 복사합니다)

ssh 연결을 통한 최신 버전의 rsync 터널은 기본적으로 자동으로 제공됩니다.


당신이 할 수 있기 때문에 scp당신에게 확인을해야 ssh,
중 스크립트는 다음 또는 로그인 및 실행 ...

# After reaching the server of interest
cd /usr/some/unknown/number/of/sub/folders
tar cfj pack.tar.bz2 $(find . -type f -name *.class)

로컬 서버로 돌아 가기 (로그 아웃) 및 scp,

# from the local machine
cd /usr/project/backup/some/unknown/number/of/sub/folders
scp you@server:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 .
tar xfj pack.tar.bz2

당신이 찾을 경우 $(find ...)로 타르 변화를 너무 깁니다,

find . -type f -name *.class | xargs tar cfj pack.tar.bz2

마지막으로,에서 보관하고 /usr/project/backup/있는데
왜 추출이 귀찮습니까? tar.bz2날짜 + 타임 스탬프와 함께을 유지하십시오 .


ssh 키 기반 인증을 사용하면 다음 스크립트가 작동합니다.

for x in `ssh user@remotehost 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo 'user@remotehost:'$x) /usr/project/backup$y/; done

파일에 대한 아래 명령.

scp`find. -maxdepth 1-이름 "* .log"\! -name "hs_err_pid2801.log"-type f` root @ IP : / tmp / test /

  1. IP는 대상 서버 IP 주소가됩니다.
  2. 포함 파일의 경우 -name "* .log".
  3. \! 제외 파일의 경우 -name "hs_err_pid2801.log"
  4. . 현재 작업 디렉토리입니다.
  5. -파일 유형의 경우 f를 입력합니다.

디렉토리 명령 아래.

scp -r`find. -maxdepth 1-이름 "lo *"\! -name "localhost"-type d` root @ IP : / tmp / test /

요구 사항에 따라 위의 명령을 사용자 지정할 수 있습니다.


실제로 scp를 사용하려면 간접적 인 방법이 있습니다. 로컬 폴더 '/ src'아래에있는 모든 .jpg 파일을 원격 서버 10.1.1.2의 '/ dst'폴더에 복사하고 싶다고 가정 해 보겠습니다.

#make a clean temp folder
mkdir /tmp/ttt
#copy all .jpg file and retain folder structure as-is
find /src -type f -name *.jpg -exec cp --parents \{\} /tmp/ttt \;
#copy to remote target folder as-is and retain original time attributes
scp -rp /tmp/ttt/* 10.1.1.2:/dst
#if copy ok, remove temp folder
rm -rf /tmp/ttt

  1. 소스 폴더를 somedir다음 위치에 복사하십시오 .

    cp -r srcdir somedir

  2. 불필요한 파일을 모두 제거하십시오.

    find somedir -name '.svn'-exec rm -rf {} \ +

  3. scp 시작 somedir

참고URL : https://stackoverflow.com/questions/1228466/how-to-filter-files-when-using-scp-to-copy-dir-recursively

반응형