나는 모든 디렉토리의 모든 파일이 고유하도록 A1/B1/C1/files111*
, A1/B1/C2/files112*
, A1/B2/C1/files121*
, 등 의 디렉토리 구조를 가지고 있습니다 . A1/B2/C2/files122*
scp(또는 다른 도구)를 사용하여 모든 터미널 파일을 한 번에 가져오는 방법이 있습니까 files###*
?
답변1
질문에서 이를 지정하지 않았으므로 디렉터리 구조가 원격이고 로컬을 원한다고 가정하겠습니다.
당신이 해야 할 일은 와일드카드를 사용하는 것이지만 클라이언트 측에서 이스케이프 처리하여 로컬 셸이 이를 무시하고 전달하도록 하는 것입니다. 이를 재귀 플래그( -r
)와 결합하면 원하는 대로 수행됩니다.
scp -r remotemachine:some/directory/files\* /some/local/target/directory/
중요한 부분은 백슬래시입니다. 그러면 로컬 쉘이 별표를 무시하고 대신 전달하게 됩니다. 이렇게 하면 files*
하위 디렉터리를 포함하여 원격에서 모든 항목을 가져올 수 있습니다 . 또한 이름이 files*
.
답변2
먼저 이러한 방식으로 복사된 파일에 어떤 일이 발생하고 향후 복사 작업에 어떤 영향을 미칠 수 있는지 고려해야 합니다. 그들은 거기 머물 예정인가요? 삭제되나요? 보관되었나요? 이를 알고 나면 복사 명령을 작성한 다음 필요한 정리 작업을 작성할 수 있습니다. 다음은 먼저 모든 기존 파일을 복사한 다음 원격 서버에서 삭제하는 샘플 스크립트입니다.
복사 및 삭제 작업 사이에 파일이 변경될 위험이 있으므로 먼저 해당 파일을 임시 디렉토리로 옮긴 다음 거기에서 복사 및 삭제하여 작업 디렉토리가 일반 작업을 계속할 수 있도록 했습니다.
또한 매일 같은 시간에 자동으로 이러한 파일을 검색하는 cron 작업을 만들고 작업이 성공적으로 완료되었는지 확인하기 위해 몇 가지 온전성 검사를 추가했습니다.
#!/bin/bash
HOST="RemoteServerIPorHostName"
localDir="/some/local/dir"
for remoteTargets in "/A1/B1/C1/files111*" "/A1/B1/C2/files112*" "/A1/B2/C1/files121*" "/A1/B2/C2/files122*"
do
scp -pr user@$HOST:$remoteTargets $localDir
ssh -t user@$HOST 'rm -rf $remoteTargets'
done
답변3
ssh user@remote "find /target/A1 -iname \"*files*\" -exec scp {} user@local:/desitnation \;"
ssh
원격 시스템에 연결하고 큰따옴표로 묶인 코드를 실행합니다.""
find
디렉토리 내에서/target/A1
"files"라는 키워드가 포함된 모든 파일을 검색합니다.-iname
이전 쌍을 너무 일찍 종료하지 않으려면 대소문자를 구분하지 않는 검색 매개변수에 대해 백슬래시와 큰따옴표가 필요합니다 .-exec
코드를 실행하는 데 사용되는 또 다른 매개변수입니다find
. 우리의 경우scp
모든 검색 결과를 실행하고 곡선 괄호를 사용하여find
전달 합니다 .scp
{}
scp
발견된 파일을 로컬 또는 다른 컴퓨터에 복사합니다.
비밀번호 없이 인증을 사용하기 위해 공개 키를 교환했기 때문에 이는 테스트 설정에서 작동했습니다.