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