find의 출력을 scp의 입력 목록에 파이프하고 싶습니다. 어떻게?


10

나는 초보자 리눅스 사용자이며 한 컴퓨터에서 다른 컴퓨터로 긴 파일 목록을 보내려고합니다. 인수 목록이 너무 길어서 찾기를 사용하고 있습니다. 그래도 표현을 설정하는 데 문제가 있습니다. 누군가 도울 수 있습니까?

짧은 인수 목록에 일반적으로 입력하는 내용은 다음과 같습니다.

scp ./* phogan@computer/directory...

이것이 find로 번역 될 수 있다고 생각합니다.

scp find . -name "*" phogan@computer/directory...

아마도 배관을 사용할 수 있을까요? 어떤 제안이라도 도움이 될 것입니다. 미리 감사드립니다.

답변:


16
find . -name "*" -exec scp '{}' phogan@computer:/directory ';'

일반적으로 모든 파일을 하나의 거대한 blob으로 'tar'하고 'scp'를 한 번만 호출합니다. 이 같은:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • tar의 --exclude = 또는 --include = 매개 변수로 해결할 수 있습니다.
  • 또 다른 옵션은 rsync 를 사용하는 것 입니다.

ssh / scp와 함께 암호를 사용하는 경우 find를 사용하는 솔루션이 모든 파일에서 암호를 요구하지 않습니까?
quck quixote

그가 ssh-keys를 사용하는 방법을 알고 있다고 가정하자 :) 1000 개의 암호 질문과 관련된 문제는 tar 접근 방식의 이유이기도하다
akira

15

하나의 명령으로 수행 할 수 있습니다 scp.

  • 최신 버전 scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • 이전 버전의 경우 :
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

캡슐 체해야합니다 find사이에 명령을 역 따옴표 ` 단일하지 따옴표 ' .


어떤 scp 버전, 어떤 리눅스 배포판? 예를 들어 Ubuntu 14.04의 scp에는이 옵션이 없습니다.
geekQ

2
안녕, 구 버전은 그것을 지원, 새로운 버전은 더 간단한 명령을 지원합니다scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues

1
여러 파일에서 작동하지 않습니다
Amruta

@Amruta 사용-r
교활한

@slybloty scp -r는 여러 항목 (여러 파일)이 아닌 단일 (디렉토리) 항목의 재귀를위한 것입니다.
AndrewF

2
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done

그는 어쨌든 하나의 명령을 원한다
John T

유용함grep -l pattern *
Tanj

공백이있는 파일에서는 작동하지 않는 것 같습니다.
Christophe De Troyer

1

내가 제안 할게

find . -print0 | tar --null --files-from=/dev/stdin -cf - | ssh phogan@computer tar -xf - -C /directory

이 솔루션은 파일 이름이 명령 줄 인수로 해석 될 수있는 명령 줄에 포함되지 않도록합니다.

주의해야 할 또 다른 사항은 파일 이름에 공백이 포함될 수 있다는 것입니다. 이것은 bash의 for 루프가 파일 이름 목록에 어려움을 겪을 수 있음을 의미합니다.

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