find ./subdir/* -print0 연결 파일 정렬을 사용할 수 없습니다. xargs -0 cat > merge.txt

find ./subdir/* -print0 연결 파일 정렬을 사용할 수 없습니다. xargs -0 cat > merge.txt

split다음에서 출력된 조각을 처리하여 생성된 수천 개의 파일을 연결하려고 합니다.

find ./subdir/* -print0 | sort | xargs -0 cat > full_merge.txt

다음 파일은 다음 subdir 과 같습니다.

something.foo.aaaaa.output
something.foo.aaaab.output
something.foo.aaaac.output

...

하지만 난 이해해File name too long

왜?

답변1

왜 이 오류가 발생하는지 잘 모르겠습니다.

find ./subdir/* -print0

( --print0오타라고 가정) 일부 NUL 문자가 포함된 종료되지 않은 큰 줄을 출력합니다. 개행 문자로 끝나지 않고 NUL 문자를 포함하기 때문에 텍스트가 아니므로 텍스트 유틸리티(예:)의 동작이 sort지정되지 않습니다. 이를 하나의 큰 줄로 처리하고 누락된 개행 문자를 다시 추가하는 GNU 정렬입니다.

sort어쩌면 내가 아는 한 입력의 NUL 문자를 줄 구분 기호로 처리하지만 출력 줄은 줄 바꿈으로 끝나는 busybox 를 사용하고 있을 수 있습니다 .

xargs -0NUL로 구분된 레코드가 필요합니다. 따라서 GNU 정렬을 사용하면 출력은 추가된 추가 개행 문자로 구성된 허위 요소에 의해 생성된 목록과 동일한 목록으로 처리 xargs됩니다 .sortfind -print0sort

busybox의 경우 sort모든 NUL이 줄바꿈으로 변환되었기 때문에 알려진 레코드는 하나만 있으므로 줄바꿈이 포함된 거대한 파일 이름으로 호출됩니다 xargs -0.cat

여기에서 파일 이름 목록을 정렬하려면 GNU sort와 해당 -z옵션을 사용해야 합니다.

find subdir -type f -print0 | sort -z | xargs -r0 cat > merge.txt

또는 파일 이름에 개행 문자가 포함되어 있지 않다고 가정하고 다음을 실행합니다.

find subdir -type f | sort | tr '\n' '\0' | xargs -r0 cat > merge.txt

태그를 사용하고 있으므로 zsh다음 작업도 모두 수행할 수 있습니다 zsh.

autoload zargs
zargs subdir/**/*(D.) -- cat > merge.txt

이렇게 하면 실제로 원하는 항목에 더 가까운 정렬 순서가 제공됩니다.

답변2

xargs' -0매개변수는 다음과 같은 경우에 적용됩니다.입력하다NUL로 구분되어 있지만 그렇지 않습니다. 이 작업을 수행하려면 이전 명령을 NUL로 구분해야 합니다. 안타깝게도 이를 수행할 방법은 없는 것 같습니다.POSIX 호환:

find ./subdir/* -print0 | sort -z | xargs -0 cat -- > full_merge.txt

관련 정보