find
명령은 파일 이름을 널로 구분 된 문자열 ( -print0
제공된 경우 ) 로 출력 xargs
할 수 있으며 -0
옵션을 켜면 사용할 수 있습니다 . – 그러나 그 사이에, 그것은 파일의 컬렉션을 조작하기 어렵다 sort
명령을 가지고 -z
있지만, 스위치를 가능 그 파일을 정렬 할 수있게 head
하고 tail
그들을 필요가 없습니다.
어떻게 할 수있는 head
및 tail
편리한 방법으로 그 널 (null)로 구분 된 입력에? (저는 짧고 느린 루비 스크립트를 만들 수 있지만 더 좋은 방법이 있기를 바랍니다)
답변
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 ...