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/'
-printf
GNU의 조건자는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/
해당 경로를 인쇄하려면(어휘적으로 정렬되었지만 대체 정렬 순서는 및 한정자를 참조하세요) n
를 o
사용 하세요 .O
j
::
답변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는 생각할 수 있는 거의 모든 배포판, 심지어 가장 작은 배포판에서도 바이너리로 존재합니다.