내가 실행하면 svn st | awk '{print $2}'
다음을 얻습니다.
a.py
b.py
c.py
scp
그런 다음 이 파일을 원격 서버로 보내고 싶습니다 . 나는 시도했다:
svn st | awk '{print $2}' | xargs scp my_name@my_server:~/
그러나 이것은 작동하지 않습니다. 이를 수행하는 올바른 명령은 무엇입니까?
감사합니다!
답변1
이 시도. 최신 버전의 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
이것이 작동하지 않는 이유는 xargs
실행 하라고 명령하기 때문입니다.
scp my_name@my_server:~/ a.py b.py c.py
매개변수의 순서가 원하는 작업과 일치하지 않습니다. 한 가지 해결책은 명령줄에서 대상 앞에 파일 이름이 나타나도록 하는 것입니다. 이를 위해서는 GNU xargs(예: Linux 또는 Cygwin)가 필요합니다. 이를 수행할 때 -d '\n'
일반적인 -d
소프트웨어 소스 트리(파일 이름이 매우 온화한 경향이 있음) 이렇게 할 필요는 없습니다.
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
이 방법의 단점은 scp
각 파일에 대해 개별적으로 호출된다는 것입니다. SSH 연결을 설정하는 데 시간이 걸리므로 작은 파일을 많이 복사하는 경우 이는 상당한 영향을 미칠 수 있습니다. SSH 마스터 연결을 사용하면 연결당 시간을 크게 줄일 수 있습니다(이 답변의 범위를 벗어납니다. 매뉴얼, 특히 ControlMaster
및 ControlPath
옵션을 참조하세요 .ssh/config
).
매개변수를 올바른 위치에 강제로 배치하는 한 가지 방법은 중간에 쉘을 사용하는 것입니다. 이는 xargs
or 를 사용할 때 인수를 재정렬하는 일반적인 기술 입니다 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:~/