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

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

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

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

그렇다면 이 작업을 수행하려면 어떻게 해야 합니까 parallel?

답변1

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

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

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

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

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

관련 정보