내가 실행하면 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'
개행을 포함하지 않는 모든 파일 이름이 작동하는지 확인하기 위해 전달할 수 있습니다 ( -d
xargs는 입력에 이상한 인용을 기대합니다). 파일 이름이 매우 길어지는 일반적인 소프트웨어 소스 트리를 사용하는 경우에는 필요하지 않습니다.
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
이 방법의 단점은 scp
모든 파일에 대해 별도로 호출됩니다. 작은 파일을 많이 복사하는 경우 SSH 연결을 설정하는 데 약간의 시간이 걸리므로 큰 차이가 생길 수 있습니다. SSH 마스터 연결을 사용하여 연결 당 시간을 크게 단축 할 수 있습니다 (이 답변의 범위를 벗어나면 설명서, 특히 ControlMaster
및 ControlPath
옵션을 참조하십시오 .ssh/config
).
인수를 올바른 위치에 두는 방법은 중간 쉘을 거치는 것입니다. 사용할 때 재주문 인수에 대한 일반적인 기술이다 xargs
나 find … -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:~/