더 나은 hg 문자열 이스케이프

더 나은 hg 문자열 이스케이프

따라서 버전 관리 시스템 hg에 나열된 누락된 파일을 정기적으로 삭제합니다. 내가 알아차린 것은 내 스크립트가 문자열을 적절하게 이스케이프하지 않았다는 것입니다.

hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove

많은 경우에 작동하지만 일부 이상한 문자열로 recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdf인해 작동이 중단될 수 있습니다. 그런데, hg는 이 문자열이 "Windows 안전"이 아니라고 말합니다... 그게 무슨 뜻이든 간에 말이죠.

누구든지 "!"로 나열된 파일을 삭제하는 더 좋은 방법을 찾을 수 있습니까? 아니면 실종됐나요?

답변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옵션이 지원됩니다 . 널 바이트로 구분된 레코드를 생성합니다. 남은 것은 개행 문자 대신 널을 구분 기호로 처리하도록 중간 처리를 조정하는 것입니다.-0hg 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

관련 정보