scp로 파일을 _MOVE_하는 방법은 무엇입니까?


46

한 서버에서 다른 서버로 파일을 복사하지 않고 옮기는 방법 (Linux)?

man scp나에게 유용한 것을주지 않았다. 파일이 성공적으로 전송되었는지 확인해야하기 때문에 'scp'와 'rm'을 사용할 수 없습니다. 전송 중에 오류가 발생하면 파일을 삭제하지 않아야합니다.

어쨌든 종료 코드를 사용해야하지만 어떻게해야합니까? 또한 많은 파일이 있으며 마지막 파일이 실패하면 성공적으로 전송되지 않은 전체 파일을 유지하는 것이 좋지 않습니다.

SCP 외에 다른 것이 있을까요?

답변:


47

ssh를 통한 rsync는 아마도 --remove-source-files옵션을 사용하는 것이 가장 좋습니다.

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

빠른 테스트는 제공합니다.

[tomh@workstation001 ~]$ mkdir test1
[tomh@workstation001 ~]$ mkdir test2
[tomh@workstation001 ~]$ touch test1/testfile.1
[tomh@workstation001 ~]$ ls test1/
testfile.1
[tomh@workstation001 ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 tomh@localhost:/home/tomh/test2/
sending incremental file list

sent 58 bytes  received 12 bytes  10.77 bytes/sec
total size is 0  speedup is 0.00

[tomh@workstation001 ~]$ ls test1/
[tomh@workstation001 ~]$
[tomh@workstation001 ~]$ ls test2/
testfile.1

@SvenW에서 언급했듯이 -e ssh기본값은 생략되므로 생략 할 수 있습니다.


7
-e ssh현재 몇 년 동안 암시 적 기본값이므로 일반적으로이 매개 변수를 더 이상 사용할 필요가 없습니다.
Sven

@SvenW 아 아 좋은! scp는 대부분의 목적으로 재귀 모드를 지원하기 때문에 매일 rsync를 필요로하지 않습니다.
Tom H

그 사용 후이 (rsync를 그들을 제거하지 않습니다) 빈 폴더를 청소 : serverfault.com/a/95935/58568을
bmaupin

1
smv() { rsync -az --remove-source-files "$@"; }내 툴박스에 추가되었습니다 . 감사합니다.
Rhys Ulerich

rsync가 없으면 어떻게합니까? 예를 들어 OpenWrt에는 rsync가 없으며 scp를 사용하여 파일을 이동해야합니다. 지금 무엇을해야합니까?
발렌티

19

rsync대신에 사용하십시오 scp:

rsync -avz --remove-source-files /sourcedir user@host:/targetdir 

에 대한 추가 정보 man rsync.


17

이 질문에 대한 답변은 훌륭했지만 대답은 받아 들였지만 첫 페이지 상단에 표시되었으므로 적어도 우아하지 않으면 더 정확하게 대답하려고 노력할 것이라고 생각했습니다. 예,의 반환 코드를 사용할 scp수 있으며 자주 사용합니다. 에서 bash:

scp foo user@server:/destination && rm foo

여러 파일에 대해 스택을 올바르게 복사하고 처리하기 위해 여러 파일에 대해 설명합니다. 여러 파일의 경우 :

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done

이 마지막은 당신이 사용하는 경우에만 실용적 ssh-agent이지만, 나는 당신이 있기를 바랍니다.


1
나는 이것이 답이되어야한다고 느낀다. 정확하게 묻는 질문에 대답합니다.
트래비스 Griggs

SCP는 제한없이 (AFAIK) 대역을 처리하지 않기 때문에 rsync를 사용하여 hanswer를 사용하여 정의 된 대역에서 파일을 하나씩 이동했습니다. 감사 !
Moonchild

@Moonchild, scp는 실제로 -l플래그를 사용하여 대역폭 제한을 처리 할 수 ​​있습니다 . 예 : -l 81928192 kb / s로 전송 제한
Spencer D

3

내 상황에서 ssh 포트는 22가 아니므로

rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

나를 위해 작동합니다.


5
모든 명령에 대해 지정하는 것보다 사용자 지정 ssh 포트 번호를 ssh 구성 파일 (~ / .ssh / config)에 넣는 것이 훨씬 좋습니다. 전역 적으로, 호스트별로 또는 호스트 이름과 일치하는 정규식으로 지정할 수 있습니다.
몰래

소스와 대상 모두에 대해 포트를 개별적으로 설정하는 방법은 무엇입니까?
Brethlosze 2016 년

3

이전과 같이 대상 서버가 있으면 사용할 수 없습니다

--remove-source-files

하지만 당신은 사용해야합니다

--remove-sent-files --protocol=29

대신에.


3

두 단계로 수행해도 문제가되지 않으면 scp원격 서버에서 파일을 복사 한 다음 ssh -e "rm /path/to/file"디스크에서 제거 하는 데 사용할 수 있습니다 . 특히 컴퓨터간에 파일을 이동할 때 문제가 발생할 수 있으므로 복사와 삭제를 별도로 수행하는 것이 좋으며 파일이 처음으로 성공적으로 복사되었다는 것을 확신 할 때만 파일을 제거하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.