고양이와 파이프가 작동하지 않고 위치를 찾을 수 없는 이유는 무엇입니까?

고양이와 파이프가 작동하지 않고 위치를 찾을 수 없는 이유는 무엇입니까?

나는 이것을하려고 노력하고 있습니다 :

locate pg_type.h | cat

하지만 이 명령은 pg_type.h를 찾는 것과 다르지 않습니다.

무엇을 바꿔야 하나요? cat pg_type.h어디서든 공연을 하고 싶어요 pg_type.h.

답변1

locate -e0 '*/pg_type.h' | xargs -r0 cat

locate pg_type.h경로에 있는 모든 파일이 검색됩니다 pg_type.h. 예를 들어 디렉터리가 있으면 rpg_type.horn그 안에 있는 모든 파일이 표시됩니다.

-0출력이 없으면 locate파일이 파일 이름에서 완벽하게 유효한 문자인 줄 바꿈으로 구분되므로 후처리가 불가능합니다.

cat인수가 없으면 stdin에서 읽은 내용이 stdout에 기록되므로 down의 출력 locate | cat만 전달됩니다 . 필요한 것은 파일 목록을 다음과 같이 전달하는 것입니다.locatecatlocate논쟁도착하다 cat.

xargs일반적으로 데이터 스트림을 매개변수 목록으로 변환하는 데 사용됩니다 . 입력이 없으면 호출되지 않습니다 -r. cat그렇지 않은 경우 -0( -r표준은 아니지만 많은 구현에서 찾을 수 있습니다. 적어도 xargs가 유용한 경우) xargs다음을 찾습니다 .성격입력에서 매개변수로 변환됩니다.성격백슬래시, 작은따옴표 및 큰따옴표를 사용하여 이러한 구분 기호를 이스케이프할 수 있는 공백으로 구분된 locate이 형식은 일반적으로 파일 이름을 표시하는 데 사용되지 않습니다.

이것이 바로 우리가 NUL 문자(파일 경로에 허용되지 않는 유일한 문자)를 사용하여 파일 이름을 구분하는 and 옵션을 -0두 가지 모두에 사용하는 이유입니다.locatexargs

또한 이는 locate표준 명령이 아니며 버전, 옵션 및 동작이 다른 수많은 구현이 있다는 점에 유의하세요. 위의 코드는 적어도 상대적으로 최신 버전의 GNU locatemlocateLinux 기반 운영 체제의 가장 일반적인 구현에서 작동합니다.

답변2

locate명령은 to의 출력을 cat표준 입력으로 파이프합니다. 그것은 당신이 원하는 것이 아닙니다. 무엇locate원하는 것은 다음 cat과 같은 출력을 갖는 것입니다.토론.

나는 이것을 수행하는 방법이 다음과 같다고 믿습니다 xargs:

locate pg_type.h | xargs cat

관련 정보