xargs로 scp에 매개 변수 제공


10

내가 실행하면 svn st | awk '{print $2}', 내가 얻을 :

a.py
b.py
c.py

그런 다음 scp이 파일을 원격 서버로 보내고 싶습니다 . 나는 시도했다 :

svn st | awk '{print $2}' | xargs scp my_name@my_server:~/

그러나 작동하지 않습니다. 이를위한 올바른 명령은 무엇입니까?

감사합니다!

답변:


10

이 시도. 최신 버전의 xargs에서 작동합니다.

svn st | awk '{print $2}' | xargs -iz scp z my_name@my_server:

또는 파일을 통해 루프를 반복 할 수 있습니다.

for file in $(svn st | awk '{print $2}'); do scp $file my_name@my_server: ; done


2
고마워 팀 나는 많은 구글 검색 및 해결책을 찾았습니다 : svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/나는 xargs묻기 전에 의 맨 페이지를 읽어야했다 ;)
mitnk

그리고 당신의 솔루션도 작동합니다! 그러나, 그것은 오타 거기에있다 -Iz없습니다-iz
mitnk

어떤 OS를 사용하고 있습니까? -izSolaris에서 사용 하며 항상 작동합니다. 포인터 주셔서 감사합니다.
팀 케네디

4
POSIX xargs-I. AIX (6.1) 매뉴얼 페이지에 따르면 -i더 이상 사용되지 않으며 -I사용해야합니다. 솔라리스 10 (9)를 모두 가지고 -i-I.
Mat

1
아, 내 지식은 쓸모 없어! -i솔라리스 2.5부터 사용 하고 있습니다. 나이가 들면 슬픈 일이야, 친구 :)
팀 케네디

4

이것이 작동하지 않는 이유는 당신이 xargs달리 라고 말하고 있기 때문입니다.

scp my_name@my_server:~/ a.py b.py c.py

논쟁의 순서는 당신이하고 싶은 것과 일치하지 않습니다. 한 가지 해결책은 파일 이름이 명령 행에서 대상 앞에 나타나도록하는 것입니다. 여기에는 GNU xargs (예 : Linux 또는 Cygwin)가 필요합니다. 우리가 그것을하고있는 동안, 우리는 -d '\n'개행을 포함하지 않는 모든 파일 이름이 작동하는지 확인하기 위해 전달할 수 있습니다 ( -dxargs는 입력에 이상한 인용을 기대합니다). 파일 이름이 매우 길어지는 일반적인 소프트웨어 소스 트리를 사용하는 경우에는 필요하지 않습니다.

svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/

이 방법의 단점은 scp모든 파일에 대해 별도로 호출됩니다. 작은 파일을 많이 복사하는 경우 SSH 연결을 설정하는 데 약간의 시간이 걸리므로 큰 차이가 생길 수 있습니다. SSH 마스터 연결을 사용하여 연결 당 시간을 크게 단축 할 수 있습니다 (이 답변의 범위를 벗어나면 설명서, 특히 ControlMasterControlPath옵션을 참조하십시오 .ssh/config).

인수를 올바른 위치에 두는 방법은 중간 쉘을 거치는 것입니다. 사용할 때 재주문 인수에 대한 일반적인 기술이다 xargsfind … -exec.

svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/

또 다른 가능성은 rsync대신에 사용하는 것입니다 scp. rsync표준 입력에서 파일 이름 목록을 전달할 수 있습니다 . 이후 rsync예상하는 패턴의 목록이 아닌 파일 이름 목록은이 파일의 이름은 와일드 카드 문자를 포함하지 않는 것이 필요합니다 (특히, 아니 줄 바꿈, 아니 \[*?없고 초기 #또는 ;).

svn st | awk '{print $2}' |
rsync -a --include-from=- --exclude='*' . my_name@my_server:~/
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.