병렬을 사용하여 많은 디렉터리를 하위 디렉터리로 분할

병렬을 사용하여 많은 디렉터리를 하위 디렉터리로 분할

parallel많은 디렉토리를 하위 디렉토리로 분할하는 데 사용하고 싶습니다 . 예를 들어 콘텐츠가 포함된 디렉토리가 1,000,000개 있지만 디렉토리 하나에 너무 많아서 기본 디렉토리에 10개의 디렉토리를 만들고 각 디렉토리에 100,000개의 원본 디렉토리를 이동하려고 합니다.

이미 명령을 시도했지만 ls -tr|parallel -n100000 mkdir "dir_{#}"\;mv {} "dir_{#}"~10 000만 하나의 하위 디렉터리(때때로 ~6200, 때로는 ~12 500)로 이동하고 너무 많은 하위 디렉터리를 생성합니다. 때로는 필요한 것보다 10배 더 많은 경우도 있습니다. 물론, 각 하위 디렉터리에 정확히 100,000개의 dirs가 필요하지는 않습니다. 101,000 또는 98,500 dirs일 수 있으며, 100,000 범위의 숫자여야 합니다.

그렇다면 를 사용하여 어떻게 이를 수행할 수 있습니까 parallel?

답변1

암소 비슷한 일종의 영양parallel해결책:

parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}' ::: *

  • j N- 일자리 수. N작업을 병렬로 실행합니다 . 귀하의 경우에는 새로운 10개의 상위 디렉토리 사이에 모든 디렉토리를 배포(이동)하기 위해 10개의 작업을 실행합니다.
  • -n100000100000- 명령줄당 최대 인수(dirname)를 사용합니다.
  • {#}- 실행할 작업의 시퀀스 번호입니다. 이 대체 문자열은 실행 중인 작업의 시퀀스 번호로 대체됩니다.
  • ::: argumentsarguments- stdin(표준 입력) 대신 명령줄을 입력 소스로 사용

수정 시간별로 정렬된 디렉터리(dirnames)를 처리하려면 다음 파이프라인을 사용합니다.

ls -dtr * | parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}'

관련 정보