scp에 정규식을 사용하는 방법

scp에 정규식을 사용하는 방법

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

원본 컴퓨터에서 대상 컴퓨터로 복사하는 것은 다음과 같습니다.잘 작동:

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

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

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

어떤 아이디어가 있나요?

답변1

나는 폰 브랜드의 의견에 동의합니다. Globing은 실행 중인 셸에서 처리됩니다. 따라서 scp user@machine:/path/*/path/*는 원격 시스템의 파일이 아닌 로컬 /path/*의 파일로 확장됩니다.

그러나 나는 단지 웃음을 위해 다음을 시도했습니다.

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

그리고...작동합니다. 시도 해봐. 따옴표를 주의하세요. 매우 필요합니다. 우리에게 알려주세요.

참고: 원격 컴퓨터의 사용자 계정은 기본적으로 다른 컴퓨터와 다른 셸로 설정될 수 있습니다.당신의이므로 와일드카드 확장 규칙이 다를 수 있으므로 주의하세요.

답변2

전달된 원격 이름은 scp실제로 원격 측에서 공백으로 구분된 패턴 목록으로 해석됩니다. 이는 일반적으로 이름에 공백이 포함된 파일을 복사하려고 할 때 번거롭지만 여기서는 유용합니다. scp -p 'user@machine:/path/a*' .이름은 로 시작하여 복사됩니다 a.

로컬이 아닌 원격으로 해석되도록 패턴을 참조하는 경우 다른 장애물을 통과하면 명령이 작동합니다. 이 모드는 !(a*)기본 쉘 모드가 아니라 ksh 확장입니다(적절한 옵션이 설정된 경우 bash 및 zsh에서도 지원됨). 따라서 이것은 원격 셸이 ksh인 경우에만 작동하며 다른 셸 exec ksh에서 왔 .profile거나 이와 유사한 경우에는 작동하지 않습니다.

어떤 종류의 제한되거나 오래된 환경에 있지 않는 한 가장 쉬운 방법은 scp원격 파일이 로컬 파일처럼 작동하도록 하려는 것이므로 로컬 파일로 만드십시오.sshfs. 이를 위해서는 로컬 시스템에 FUSE가 필요하고 sftp-server원격 시스템에 SFTP 서버(즉, 시작된 실행 파일)가 필요합니다.sshd

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .

답변3

이것은 "정규식을 사용하는 scp"가 아니라 파일 글로브를 처리하는 쉘입니다. scp확장된 파일 목록을 얻으세요. 확장은 명령이 실행되는 시스템에서 발생합니다.

답변4

이전 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

관련 정보