Unix 검색 결과에 대한 사용자 정의 구분 기호

Unix 검색 결과에 대한 사용자 정의 구분 기호

find일부 파일을 찾고 모든 파일을 파일 사이에 사용자 지정 구분 기호가 있는 단일 줄(줄 바꿈 없음)로 반환하는 데 사용하고 싶습니다 .

예를 들어 세 개의 파일에 대한 결과는 다음과 같습니다.

/my/file/1::/my/file/2::/my/file/3

바꾸다

/my/file/1
/my/file/2
/my/file/3

표준 유닉스 도구를 조합하여 이를 달성할 수 있는 방법이 있습니까 find?

답변1

find및 의 GNU 구현을 통해 다음을 sed사용할 수 있습니다.

find . -type f -printf '%p::' | sed '$s/::$/\n/'
  • -printfGNU의 조건자는 find로 구분된 한 줄로 파일 이름을 인쇄한 ::다음 sed마지막 줄의 마지막 줄(여기서는 제한 없음)을 개행 문자로 바꿉니다.::

예:

$ find . -type f -printf '%p\n'
./foo
./test file
whose name
contains newline characters and ::
./bar

$ find . -type f -printf '%p::' | sed '$s/::$/\n/'
./foo::./test file
whose name
contains newline characters and ::::./bar

-printf '%p::'is 와 동등한 표준 입니다. POSIX는 텍스트가 아닌 것을 처리할 수 없기 때문에 -exec printf '%s::' {} +이 GNU sed표현식에는 동등한 것이 없습니다 .sed

답변2

그리고 zsh:

(){ print -r -- ${(j[::])argv}; } /my/**/*(N.)

아래에서 숨겨지지 않은 모든 일반 파일을 찾고 /my/해당 경로를 인쇄하려면(어휘적으로 정렬되었지만 대체 정렬 순서는 및 한정자를 참조하세요) no사용 하세요 .Oj::

답변3

-printf는 많은 find 구현에서 발견되지 않습니다. 이러한 경우에는 이 -exec명령을 사용하여 동일한 목적을 달성할 수 있습니다.

find "/some/dir" -exec echo -n {}"|" \;

echo각 디렉토리 항목 인쇄

-n개행 문자 인쇄를 방지하는 수정자

"|"문자는 각 항목 뒤에 추가됩니다.

에코 구현이 이 -n플래그를 지원하지 않는 경우 간단합니다.

find "/some/dir" -exec printf "%s" {}"|" \;

위의 내용은 OpenWRT 또는 VMWare ESXi와 같은 최소 펌웨어 지향 배포판에 있는 busybox를 포함하여 거의 모든 bash 쉘에서 작동합니다.

(*) 마지막 예의 printf 호출은 첫 번째 답변에서 제안된 조회 옵션이 아니라 외부 조회입니다. printf는 생각할 수 있는 거의 모든 배포판, 심지어 가장 작은 배포판에서도 바이너리로 존재합니다.

관련 정보