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 안전"이 아니라고 말합니다. 그게 무슨 뜻인지는 모르겠지만요.

누군가 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.pdfxargs

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

관련 정보