xargs로 scp에 매개 변수 제공 얻을 : a.py b.py c.py 그런 다음 scp이

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

a.py
b.py
c.py

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

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

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

감사합니다!



답변

이 시도. 최신 버전의 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


답변

이것이 작동하지 않는 이유는 당신이 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:~/


답변