답변:
GNU head
및 tail
coreutils 버전 8.25부터 -z
옵션이 있습니다.
이전 버전과 또는 비 GNU 시스템을 위해, 당신은 시도하고 스왑 수 \0
및 \n
:
find ... -print0 |
tr '\0\n' '\n\0' |
head |
tr '\0\n' '\n\0'
어떤 점에 유의 head
구현 NUL 문자에 대응 할 수없는 (그리고 그렇지 않은 POSIX에 의해 요구하고)하지만, 어디에 지원을 찾아 -print0
, head
텍스트 유틸리티는 일반적으로 NUL 문자를 지원합니다.
함수를 사용하여 두 명령 사이의 명령을 래핑 할 수도 있습니다 tr
.
nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}
find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...
아래 nul_terminated
에서 a \0
는 개행 문자를 의미합니다. 예를 들어 다음 \n
과 _
같이 바꾸십시오 .
find . -depth -name $'*\n*' -print0 | nul_terminated sed '
p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv
( \x0
또한 GNU 확장 임).
둘 이상의 필터링 명령 을 실행해야하는 경우 다음을 수행 할 수 있습니다.
find ... -print0 |
nul_terminated cmd1 |
nul_terminated cmd2 | xargs -r0 ...
그러나 이는 몇 가지 중복 tr
명령을 실행하는 것을 의미 합니다. 또는 다음을 실행할 수 있습니다.
find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
-print0 | tr '\n\0' '\0\n'
이 선 그들 개행 문자로 변환 된 파일 경로를 나타내는를 \0
. 따라서 첫 번째 줄을 사용 head -n 1
하고 \0
s를 다시 줄 바꿈으로 tr '\0\n' '\n\0'
다시 변환하면 포함 된 줄 바꿈 문자가있는 첫 번째 파일 경로가 NUL로 구분됩니다.
\x0
대신 사용하는 주요 이유 ¹를 물리 치지\n
않습니까? (¹이므로 포함 할 수있는 값에 대처할 수 있음\n
)