![hg에 대한 더 나은 문자열 이스케이프](https://rvso.com/image/31684/hg%EC%97%90%20%EB%8C%80%ED%95%9C%20%EB%8D%94%20%EB%82%98%EC%9D%80%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EC%9D%B4%EC%8A%A4%EC%BC%80%EC%9D%B4%ED%94%84.png)
그래서 주기적으로 버전 관리 시스템 hg에서 누락된 것으로 나열된 파일을 제거합니다. 내가 알아차린 것은 내가 가지고 있는 이 (분명 추악한) 스크립트가 문자열을 제대로 이스케이프하지 않는다는 것입니다.
hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove
많은 경우에 작동하지만 이상한 문자열로 recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdf
인해 작동이 중단됩니다. 그런데 hg는 이 문자열이 "Windows 안전"이 아니라고 말합니다. 그게 무슨 뜻인지는 모르겠지만요.
누군가 hg 목록을 "!"로 나열하는 파일을 제거하는 더 나은 방법을 찾을 수 있습니까? 아니면 없어졌나요?
답변1
나는 사용한다:
hg addremove
그에 대한체크아웃된 디렉토리에서 지저분한 부분을 모두 제거한 후(또는 파일에 패턴을 추가한 후 .hgignore
).
hg addremove -h
당신에게 말한다 :
Add all new files and remove all missing files from the repository.
Mercurial은 *
파일 이름에 대해 불평합니다. Windows에서 파일 이름에 사용할 수 없는 예약 문자입니다. 그러나 해당 메시지 자체는 stderr
파이프의 기능에 영향을 미쳐서는 안 됩니다.
대안은 다음을 사용하는 것입니다.
hg remove --after
제거된 파일을 표시하지만 모든 파일(아직 남아 있는 파일과 제거된 파일)에 대해 주석을 달고 옵션에 반응하지 않는 것 같습니다 --quiet
.
답변2
입력을 보면 xargs
을 이해합니다 . 를 사용하는 경우 다른 어떤 것과도 다른 입력 구문과 일치하는 입력을 생성해야 합니다. 공백이 공백에만 대응되기 전에 백슬래시를 추가하기만 하면 됩니다.\!\(\*-4.pdf
!(*-4.pdf
xargs
Linux, *BSD 및 OSX에서는 따옴표 없이 널 바이트로 구분된 레코드에 대해 작업하도록 지시하는 xargs
옵션을 지원합니다 . 널 바이트로 구분된 레코드를 생성합니다. 남은 것은 구분 기호로 개행 문자 대신 널을 처리하기 위해 중간 처리를 조정하는 것입니다.-0
hg status -0
GNU awk 또는 널 바이트를 레코드 구분 기호로 지원하는 다른 awk(BSD/OSX awk가 지원하는 것 같습니다)를 사용하면 변환을 awk로 전환할 수 있습니다.
hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove