대상의 기존 파일을 바꾸지 않고 scp


158

대상 디렉토리의 내용을 바꾸지 않고 전체 디렉토리를 같은 이름의 디렉토리에 복사하려면 어떻게합니까? (대신 대상 폴더의 내용에 추가하고 싶습니다)


예, 그것은 이다 유용한 프로그램 / 유틸리티 하나를 가지고 있지 않을 때 짜증나는 "이 할 수있는 경우에만 ..."옵션! 이 경우 "--noclobber"!
MikeW

답변:


139

원래 디렉토리에서 최신 파일 만 업데이트하거나 대상에 이미 존재하는 모든 파일을 건너 뛰 려면을 사용 rsync하고 전달 하십시오 .-u--ignore-existing

rsync -au /local/directory/ host:/remote/directory/
rsync -a --ignore-existing /local/directory/ host:/remote/directory/

( /소스 측에서 : rsync생성 하지 않으면 참고하십시오 /remote/directory/directory.)


@Anthon 귀하의 의견을 이해하지 못하며 chandra의 답변이나 의견을 볼 수 없습니다. --ignore-existing교체하지 않고 추가하면 어떤 데이터 손실이 보입니까?
Gilles

죄송합니다. 기존 데이터 손실을 무시하면 데이터 손실이 발생할 수있는 (그리고 OP가 요청한 IMHO가 아닌 IMHO 인) 첫 번째 예만 살펴 봤습니다.
Anthon

원격 시스템을 rsync쉽게 사용할 수 없는 경우에는 도움이되지 않습니다 .... (Win32-OpenSSH처럼)
Gert van den Berg

@GertvandenBerg rsync는 SSH보다 어렵지 않게 Windows에 설치하기가 쉽습니다.
Gilles

@Gilles : 사실이지만 모든 옵션에 Cygwin DLL이 포함되어있는 것 같습니다 ... (OpenSSH의 MS 포트의 현재 상태는 SCP에서 압축을 활성화하면 SCP를 손상시키기에 충분합니다 ...) -OpenSSH도 사소하지 않은 것처럼 보입니다. 시간이 지남에 따라 개선되기를 바랍니다. (Solaris 10은 타사 패키지 --rsync-path가 필요한 다른 예 입니다)
Gert van den Berg

82

scp 는 파일에 대한 쓰기 권한이 있으면 파일을 덮어 씁니다.

즉, scp파일에 대한 쓰기 권한을 일시적으로 제거하여 해당 파일을 효과적으로 건너 뛸 수 있습니다 (파일 소유자 인 경우).


5
고마워 내가 찾던 트릭이었습니다.
사카린

*를 추가 한 파일을 다시 복사해야합니다. 예scp -r user@server.com:/location/of/files/* /local/location/
Rick

1
검색 . -type f -exec chown 루트 : 루트 {} \;
ling

1
드물게 디렉토리의 일부 파일 만 덮어 쓰고 ( "보호되지 않은 경우") 파일 권한이 파일에서 균일하지 않은 경우이 솔루션이 작동하지 않을 수 있습니다. 그렇지 않으면 매우 간단하고 효과적입니다.
sancho.s

Windows에서 모든 파일을 선택하려면 마우스 오른쪽 버튼으로 클릭-> 속성-> 읽기 전용
BenJammin

12

날짜별로 새 파일 만 복사 할 수 있습니다. 사용하다find

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/

+7은 무엇을 의미합니까?
Francis Kim

@FrancisKim 7 일 전에 수정되었음을 의미합니다. 따라서이 쿼리는 지난 7 일 이내에 수정 된 * .gz 파일을 선택합니다.
Vadim Eremeev

4
+7이 실제로 7 일 이상을 의미하지 않습니까?
Jeff H.

1
예, "7 일 이상 전"을 의미합니다. 누가이 말을했는지 모르겠다.
Stefan Reich

9

대상 파일 내용을 읽기 전용으로 만들 수있는 경우 :

find . -type f -exec chmod a-w '{}' \;

실행하기 전에 scp(기존 파일을 불평하고 건너 뜁니다).

그리고 나중에 다시 변경하여 chmod +wumask 기반 값을 얻습니다. 파일에 umask에 따라 쓰기 권한이없는 경우 복원 할 수 있도록 권한을 저장해야합니다.

(Gilles의 답변은 기존 파일이 최신 파일 인 경우 덮어 쓰고, 그 방법으로 귀중한 데이터를 잃어 버렸습니다. 왜 잘못되고 해로운 답변이 많은 투표를했는지 이해가되지 않습니다).


2
나는 그것을 얻지 못했습니다 : 어떻게 rsync --ignore-existing데이터를 잃어 버렸습니까?
Gilles

4
find: missing argument to '-exec'이 명령을 사용 하여 오류가 발생 했으며 대신 다음을 사용해야했습니다 find . -type f -exec chmod a-w {} \;. 내 리눅스는 나쁘다, ymmv.
wpearse

이것은 더 좋고 안전한 답변입니다. 권한을 변경하는 올바른 명령은 @wpearse가 언급 한대로입니다.find . -type f -exec chmod a-w {} \;
Amir

6

내 경우에는 내가 사용하지 수, 유사한 작업을했다 rsync, csync내 기억은 SFTP을 가지고 있기 때문에, 또는 FUSE. rsync파일의 날짜와 시간을 변경할 수 없습니다. 같은 다른 유틸리티 (예 csync:)에서 다른 오류가 표시되었습니다. " 임시 파일을 만들 수 없습니다 .

스토리지 서버에 액세스 할 수있는 경우 여기에서 데몬으로 설치 openssh-server하거나 시작 rsync하십시오.

제 경우에는-나는 이것을 할 수 없었으며 해결책은 lftp입니다 . lftp의 동기화 사용법은 다음과 같습니다.

lftp -c "open -u login,password sftp://sft.domain.tld/; \
    mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"

/src/folder-는 내 PC의 폴더 /rem/folder입니다 sftp://sft.domain.tld/rem/folder.

링크를 통해 매뉴얼 페이지를 찾을 수 있습니다 : http://lftp.yar.ru/lftp-man.html


6

전체 파일 묶음을 복사하려면 파일을 더 빨리 타르십시오. 또한 -k를 사용하면 대상 시스템에서 파일의 압축을 풀 때 tar가 파일을 겹쳐 쓰지 못하게됩니다.

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 

1
원격으로 연결합니다. 먼저 소스의 tar, ssh 연결로 파이프 및 원격 시스템에서 압축을 풉니 다.
huembi

-1

scp파일을 덮어 쓰고 그 작업을 중지하는 스위치는 없지만, 파일을 복사하고 scp를 수행 한 다음 기존 파일을 다시 복사 할 수 있습니다. 예 :

  1. 기존 파일을 모두 복사

    mkdir original_files ; cp -r * original_files/
    
  2. scp를 사용하여 모든 내용 복사

    scp -r user@server:dir/* ./
    
  3. scp가 작성한 것 위에 원본 파일을 복사하십시오.

    cp -r original_files/* ./
    

3
이 방법은 리모컨에서 파일을 가져 와서 중단 한 부분을 가져올 때 도움이되지 않습니다. 즉, 전체 목적이 시간을 절약하는 것이라면.
Oliver Williams

-1

이를 달성하는 또 다른 방법 ls은 대상 폴더 에서 수행하는 것 입니다.

원격 대상 폴더에서 :

ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder

소스에서 :

cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data

목적지에서 :

scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer

이러지 마십시오. 1. ls 구문 분석하지 마십시오 . 2. 파일 이름에 - >공백 줄 바꿈이나 다른 특수 문자 가 포함되어 있으면 답이 위험합니다 . 3. 파이썬 스크립트에서 for-loop를 하드 코딩하십시오. 런타임에 프로그램을 생성하는 것은 많은 이유로 어렵고 까다 롭습니다 (전문 프로그래머가 수행하더라도). 쉘 스크립트를 생성하는 것은 더 나쁘다-끔찍한 생각.
점화
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.