bash에서 null로 구분 된 입력에 대해 head 및 tail을 수행하는 방법은 무엇입니까?


18

find명령은 파일 이름을 널로 구분 된 문자열 ( -print0제공된 경우 ) 로 출력 xargs할 수 있으며 -0옵션을 켜면 사용할 수 있습니다 . - 그러나 그 사이에, 그것은 파일의 컬렉션을 조작하기 어렵다 sort명령을 가지고 -z있지만, 스위치를 가능 그 파일을 정렬 할 수있게 head하고 tail그들을 필요가 없습니다.

어떻게 할 수있는 headtail편리한 방법으로 그 널 (null)로 구분 된 입력에? (저는 짧고 느린 루비 스크립트를 만들 수 있지만 더 좋은 방법이 있기를 바랍니다)

답변:


21

GNU headtailcoreutils 버전 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 ...

2
이것이 값을 구분하는 \x0대신 사용하는 주요 이유 ¹를 물리 치지 \n않습니까? (¹이므로 포함 할 수있는 값에 대처할 수 있음 \n)
Thedward

@Thedward은, 아니, 오히려 -print0 | tr '\n\0' '\0\n' 그들 개행 문자로 변환 된 파일 경로를 나타내는를 \0. 따라서 첫 번째 줄을 사용 head -n 1하고 \0s를 다시 줄 바꿈으로 tr '\0\n' '\n\0'다시 변환하면 포함 된 줄 바꿈 문자가있는 첫 번째 파일 경로가 NUL로 구분됩니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.