xargs를 GNU 병렬로 파이프

xargs를 GNU 병렬로 파이프

특정 디렉터리의 절대 경로를 가져와 압축을 위해 GNU로 파이프하는 다음 스크립트가 있습니다 parallel. 신호 13 오류가 계속 발생하지만 이유를 모르겠습니다.

find $directory -maxdepth 1 | \
grep -v "^${directory}$" | \
xargs realpath | \
parallel -j 4 zip -r ${new_directory}/{/.}.zip {}

오류는 입니다 terminated with signal 13; aborting. 때로는 오류가 발생하지 않지만 zip 파일이 출력에 존재하지 않는 경우도 있습니다 new_directory.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

겪고 있는 실제 오류를 해결하기 전에 명령에서 몇 가지 사항을 수정하여 일부 극단적인 경우를 처리해야 합니다.

find "$directory" -maxdepth 1 -mindepth 1 -print0 | \
xargs -0 realpath | \
parallel -j 4 zip -r "$new_directory"/{/.}.zip {}

변경 사항 은 다음 find과 같습니다.

  • -mindepth 1- 이렇게 하면 최상위 디렉토리가 제외되므로 명령이 필요하지 않습니다 grep -v.
  • -print0- 이렇게 하면 공백이나 이스케이프 문자가 포함된 파일에서 발생할 수 있는 문제가 해결됩니다. 모든 파일은 새 줄 대신 null 문자로 구분됩니다.

그렇기 때문에 null 문자로 구분된 입력을 읽을 수 있도록 -0명령에 추가해야 합니다 .xargs

추가 문제 해결

문제가 해결되지 않으면 추가로 디버깅해야 합니다.

  1. 먼저 parallel명령을 완전히 제거하고 명령에 대한 입력이 예상한 대로인지 확인합니다.

  2. 문제가 없으면 parallel명령에 세부 정보를 추가하여 수행 중인 작업을 정확하게 캡처합니다.

parallel -t -j 4 zip -r ${new_directory}/{/.}.zip {} 2> parallel.log
  • 그러면 파일에서 실행된 명령 목록이 표시됩니다 parallel.log. zip명령이 올바르게 생성되었는지 확인하십시오 .
  1. 로그 파일의 명령 목록에 여전히 예외가 표시되지 않으면 zip파일의 명령을 시도해 보십시오.
bash -x parallel.log

프로세스 중 어느 시점에서 오류가 발생한 단계를 확인해야 합니다.

관련 정보