역방향 일치 라인, NUL로 구분됨

역방향 일치 라인, NUL로 구분됨

파일 일치를 처리하는 내용을 작성 중인데 역방향 작업이 필요합니다. 파일 목록(예: from find . -type f -print0 | sort -z >lst)과 일치 목록(예: from grep -z foo lst >matches- 참고 이는 단지 예일 뿐이며 matches임의의 하위 집합(비어 있거나 전체 포함) 또는 lst)일 수 있으며 이제 이 목록을 되돌리고 싶습니다.

배경: 저는 다음과 같은 것을 구현하고 있습니다.찾기(1)예외 파일 목록(이 목록은 사전 필터링될 수 있지만 호출 시 파일 시스템에 파일이 존재함) 파일 목록이 그다지 크지 않으면 사용할 수 있지만, find "${files[@]}" -maxdepth 0 -somecondition -print0내가 작성하고 있는 내용을 적당히 사용하더라도 Linux 또는 BSD argv크기 제한을 초과하게 됩니다.

행이 NUL로 구분되지 않으면 을 사용할 수 있습니다 comm -23 lst matches >inverted. 일치 항목이 NUL로 구분되지 않으면 을 사용할 수 있습니다 grep -Fvxzf matches lst. 그러나 첫 번째 단락에서 언급한 생성기에서는 둘 다입니다.

GNU 도구가 설치되어 있다고 가정하면, 이것은 데비안 외부로 포팅할 필요가 없습니다. 제가 사용하고 있고 친구들이 이미 가지고 있기 때문 find -print0입니다 sort -z. 불평하지 마세요).

여기서도 코드 재사용을 시도하고 있습니다. comm -23입력 줄 구분 기호 변경을 (아직) 지원하지 않는다는 점을 제외하면 기본적으로 이미 완벽한 도구입니다.의사소통그럼에도 불구하고 과소평가되고 잘 알려지지 않은 도구입니다. Unix/Linux 도구 상자가 합리적인 기능을 제공하지 않는 경우 comm -23쉘에서 양식을 다시 구현할 수 있습니다(이 사용 사례에 맞게 단순화). 왜냐하면 스크립트에는 이미(다른 이유로) read -d ''입력 시 NUL 구분 기호를 지원하는 쉘이 필요하기 때문입니다. , 하지만 속도가 느릴 것입니다(그리고 힘들죠... 내일이나 28일에 언제 가져갈지 누군가 알기를 바라면서 근무일이 끝날 때 이 글을 게시합니다).

답변1

텍스트가 아닌 입력을 지원하는 경우 comm(GNU 도구가 일반적으로 수행하는 것처럼) 항상 NUL과 nl을 바꿀 수 있습니다(여기에서는 프로세스 대체를 지원하는 셸을 사용합니다(btw, mksh에 어떤 계획이 있습니까?)).

comm -23 <(tr '\0\n' '\n\0' < file1) <(tr '\0\n' '\n\0' < file2) |
  tr '\0\n' '\n\0'

그건일반적으로 사용되는 기술.

답변2

-vgrep을 사용하여 일치하는 항목을 검색하는 경우 grep 옵션을 사용하여 일치하지 않는 행을 찾을 수 있습니다 .

관련 정보