병렬성을 사용하여 많은 디렉터리를 하위 디렉터리로 분할하거나 이 작업을 병렬화합니다.

병렬성을 사용하여 많은 디렉터리를 하위 디렉터리로 분할하거나 이 작업을 병렬화합니다.

parallel여러 디렉터리를 하위 디렉터리로 병렬로 분할하기 위해 다른 도구나 방법을 사용하고 싶습니다 .

예를 들어 콘텐츠가 포함된 디렉터리가 1,000,000개 있는데 한 디렉터리에 담기에는 너무 많아서 기본 디렉터리에 10개의 디렉터리를 만들고 각 디렉터리에서 100,000개의 원래 디렉터리를 이동하려고 합니다. 또한 날짜별 정렬을 사용하고 싶습니다. 나는 이미 물었습니다.여기에도 비슷한 질문이 있습니다, 그러나 새로운 명령을 시도하고 새로운 결과를 얻었으므로 이제 중복된 질문이 아닙니다.

그래서 나는 이것을 시도했다.

ls -tr|parallel -n100000 mkdir "dir_{#}"\;mv {} "dir_{#}" 

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

명령을 실행했지만 ~10 000만 하위 디렉터리(때때로 ~6200, 때로는 ~12 500)로 이동하고 너무 많은 하위 디렉터리를 생성합니다(때로는 필요한 것보다 10배 더 많음).

나는 또한 이것을 사용해 보았습니다.

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

그러나 그것은 bash: /bin/ls: Argument list too long.

물론 각 하위 디렉터리에 정확히 100,000개의 디렉터리가 필요하지는 않습니다. 101,000 또는 98,500개의 디렉터리가 될 수 있으며, 100,000 범위의 숫자여야 합니다.

이 작업을 병렬로 수행하거나 를 사용하여 어떻게 수행할 수 있습니까 parallel?

답변1

문제는 셸 확장 후 명령줄이 차지할 수 있는 바이트 수에 상한이 있다는 것입니다. 이 제한은 시스템 제한에 따라 다릅니다.

getconf ARG_MAX

mv {}따라서 최대 한도에 도달하는 한 입력 파일 이름의 길이에 따라 매개변수 수가 달라집니다.

병렬성 사용을 포기하지 않고 이러한 제한을 피하는 솔루션은 작업을 두 단계로 나누는 것입니다.

ls -tr | parallel -N 100000 --pipe -k "mkdir dir_{#}; parallel -X mv -t dir_{#}"

설명하다

  • 첫 번째 단계에서는 옵션을 사용하여 --pipe표준 입력을 결정된 수로 분할합니다.더 작은 표준 입력, 각 줄에는 옵션으로 지정된 n 줄이 포함됩니다 -N. 이 예를 사용하여 효과를 확인할 수 있습니다

    seq 1000000 | parallel -N 100000 --pipe wc -l
    

    100000에서 정확한 세분화를 제공합니다.

    100000
    100000
    100000
    ...
    
  • 두 번째 단계에서는 내부 병렬이 수행됩니다.더 작은 표준 입력실행 작업에 대한 새로운 표준 입력으로 이 -X옵션은 명령줄 길이가 허용하는 만큼 많은 인수를 삽입합니다.

    mkdir dir_{#}; parallel -X mv -t dir_{#}
    

답변2

이 문제에는 많은 IO가 포함됩니다. parallel이 경우 이것이 실제로 유용할지 의심됩니다 .

어쨌든 "전통적인" 접근 방식을 고려해 보시기 바랍니다.

 mkdir dir_{1..10}
 ls -tr | nl | \
    awk '$2 !~ /^dir_/ {i=1+int($1/100000); print $2 | "xargs mv -t dir_"i}'

어디

  • ls -tr | nl 날짜별로 카탈로그를 정렬하고 보조 카탈로그 번호를 추가하세요.
  • $2 !~ /^dir_/방금 생성한 폴더를 건너뛰는 데 사용됩니다.
  • i=1+int($1/100000)디렉터리 번호를 기준으로 폴더 번호 계산
  • print $2 | "xargs mv -t dir_"i이동시 공정확산 불필요

가능하다면 각각의 시간도 비교해 보세요. ( time ....그리고 결과를 우리와 공유하세요 ☺)

관련 정보