정규식으로 scp하는 방법


13

ksh에서 문자 "a"로 시작하지 않는 모든 파일을 복사하려고합니다.

원본 컴퓨터에서 대상 컴퓨터로 복사하는 것이 제대로 작동합니다 .

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

그러나 대상 서버에 있고 원본 서버에서 복사하려는 경우 실패합니다.

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

어떤 아이디어?

답변:


17

vonbrand에 동의합니다. 글 로빙은 실행중인 쉘에 의해 처리됩니다. 따라서 scp user@machine:/path/*/ path / *는 원격 시스템이 아닌 LOCAL / path / *의 파일로 확장됩니다.

그러나 미소를 위해서만 시도했습니다.

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

그리고 .... 효과가있었습니다. 해봐 따옴표를 참고하십시오. 매우 필요합니다. 알려주세요.

참고 : 원격 시스템의 사용자 계정이 아닌 다른 쉘 프로그램에 기본 수 있습니다 당신 와일드 카드 확장의 규칙이 다를 수 있습니다, 그래서 '그렇게는 그 도자기.


1

이것은 "정규 표현식을 가진 SCP"가 아니며, 파일 globs를 다루는 것은 쉘입니다. scp이미 확장 된 파일 목록을 가져옵니다. 그리고 명령이 실행되는 시스템에서 확장이 발생합니다.

죄송합니다 (쉽게) 할 수 없습니다.


이 답변은 잘못되었습니다. 제거하십시오 :)
Michael

1

내가 찾은 것은 이전 HP-UX 시스템 (parisc 11.11)에서는 [^ a] *를 사용해야했습니다. 그러나 최신 시스템 (parisc 11.31 이상)에서는! (a *)와 작동합니다.

이것이 내가 끝낸 것입니다. 그리고 그것은 작동합니다 :

    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

두 솔루션 모두 11.11 서버에서 작동합니다.
DarkHeart

0

전달 된 원격 이름 scp은 실제로 원격 에서 공백으로 구분 된 패턴 목록으로 해석됩니다. 이름에 공백이 포함 된 파일을 복사하려고 할 때 종종 성가신 일이지만 여기서는 scp -p 'user@machine:/path/a*' .이름이로 시작하는 모든 파일을 복사하는 것이 a좋습니다.

패턴을 인용하면 다른 장애물을 통과 한 경우 로컬이 아닌 원격으로 해석되도록 명령이 작동합니다. 패턴 !(a*)은 기본 쉘 패턴 이 아니며 ksh 확장자입니다 (적절한 옵션을 설정하면 bash 및 zsh도 지원함). 원격 쉘은 다른 쉘과의되지 않은 경우, KSH 경우에만 작동합니다 그래서 exec ksh에서 .profile또는 이와 유사한.

당신이 어떤 종류의 제한 또는 골동품 환경에 있지 않는 한 쉬운 방법은 잊어 버리는 것 scp입니다. 원격 파일을 로컬 파일처럼 작동 시키려면 로컬 파일로 만드십시오 . sshfs로 원격 디렉토리를 마운트하십시오 . 로컬 컴퓨터의 FUSE와 원격 컴퓨터 의 SFTP 서버 (즉, sftp-server실행 파일 sshd)가 필요합니다.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.