일부 파일을 백업하기 위해 rsync를 사용하고 있습니다.
rsync -PaSh --stats --delete -e "-i key -p XXXX" "/source/" [email protected]:/destination/ 2> output.txt | grep -e 'bytes received' -e 'total bytes' -e files -e 'total file size:' >> output.txt
수천 개의 파일이 있기 때문에 마지막에 오류와 요약만 보고 싶습니다.
위 명령의 출력은 다음과 같습니다.
rsync: delete_file: unlink(test/test.txt) failed: Permission denied (13)
Number of files: 12 (reg: 10, dir: 2)
Number of created files: 0
Number of regular files transferred: 0
sent 382 bytes received 137 bytes 41.52 bytes/sec
나는 오류를 대문자로 변환하고(주의를 끌기 위해) 요약을 그대로 유지하고 싶습니다.
따라서 다음과 같습니다.
RSYNC: DELETE_FILE: UNLINK(TEST/TEST.TXT) FAILED: PERMISSION DENIED (13)
Number of files: 12 (reg: 10, dir: 2)
Number of created files: 0
Number of regular files transferred: 0
sent 382 bytes received 137 bytes 41.52 bytes/sec
이 목표를 어떻게 달성할 수 있나요?
감사해요
답변1
효과적으로 교환할 수 있습니다.표준 입력그리고표준 출력임시 파일 설명자의 도움으로(여기서는 fd 3):
cmd 3>&2 2>&1 1>&3- | tr '[:lower:]' '[:upper]'
즉, "새 fd를 해당 위치로 지정합니다.표준 에러점, 점표준 에러어디표준 출력포인트, 포인트표준 출력어디로 가야표준 에러원래는 "...간단하죠? :)
또는 다른 말로 하면: 지금표준 에러from 은 cmd
이렇게 파이프를 통과할 것입니다표준 출력그리고 원본표준 출력다음으로 리디렉션되었습니다.표준 에러. 이 tr
명령은 대문자 변환을 수행합니다.
고쳐 쓰다:위의 답변을 수락했지만 위시리스트에는 조작 기능이 포함되어 있습니다.표준 출력그리고표준 에러동시에. 그럼 이것을 알아내려고 노력해 봅시다... 제가 자주 하지 않는 일에 직면하게 될 것이라는 점을 명심하세요!
간단한 교환표준 출력/표준 에러유용한 일을 하지 않을 것입니다. 스왑 여부에 관계없이 단일 파이프를 통해 두 개의 서로 다른 스트림을 사용할 수 없습니다. 대안으로 내 첫 번째 생각은 FIFO(이름이 지정된 파이프)를 사용하는 것이었습니다.
mkfifo /tmp/fifo1 /tmp/fifo2
# run the key command in the background, in a subshell to suppress
# job control messages (e.g. "[1] 12345" and "[1]+ Exit ...")
( cmd > /tmp/fifo1 2> /tmp/fifo2 & )
# concatenate tr/stderr and grep/stdout using process substitution
# (I'm assuming the summary information occurs at the end of rsync output)
cat <(cat /tmp/fifo2 | tr '[:lower:]' '[:upper:]') <(grep ... /tmp/fifo1)
rm -f /tmp/fifo1 /tmp/fifo2
원한다면 실제로 이 모든 것을 한 줄에 넣을 수 있습니다!
mkfifo /tmp/fifo1 /tmp/fifo2; (cmd > /tmp/fifo1 2> /tmp/fifo2 &); cat <(cat /tmp/fifo2 | tr '[:lower:]' '[:upper:]') <(grep ... /tmp/fifo1); rm -f /tmp/fifo1 /tmp/fifo2
제 정신상태 검사는 잘 작동하니 한번 시도해 보세요.
답변2
stdout 및 stderr의 위치를 변경하지 않고 stderr를 대문자로 변환하려면 다음을 수행하십시오.
{ rsync ... 2>&1 >&3 3>&- | perl -Mopen=locale -pe '$_=uc' >&2 3>&-; } 3>&1
그러면 원본 stdout이 fd 3에 복사되므로 rsync
.
perl
대신 tr
->(GNU 사용) 또는 ->(GNU tr/sed/awk 사용) 등에 대해 더 나은 결과를 제공 할 수 있기 때문에 여기서는 사용됩니다 .Stéphane
STÉPHANE
STéPHANE
tr
traffic
TRAFFIC
TRAffiC
이제 stderr 메시지가 지연되므로 stderr이 파이프되어 stdout 및 stderr 메시지의 상대적 순서에 영향을 미칠 수 있습니다.
바라보다
다른 방법의 경우 유용할 수 있습니다.
답변3
명령 대신 다음 명령을 사용하십시오. 오류를 output.txt로 리디렉션한 후 추가 명령을 추가했습니다.
sed -i "s/.*/\U&/g"output.txt를 추가하고
제대로 작동하는지 테스트했습니다.
rsync -PaSh --stats --delete -e "-i key -p XXXX" "/source/" [email protected]:/destination/ 2> output.txt ;sed -i "s/.*/\U&/g" output.txt| grep -e 'bytes received' -e 'total bytes' -e files -e 'total file size:' >> output.txt