여러 디렉터리를 하위 디렉터리로 분할하거나 이 작업을 병렬화하려면 병렬을 사용하세요.

여러 디렉터리를 하위 디렉터리로 분할하거나 이 작업을 병렬화하려면 병렬을 사용하세요.

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개의 dirs가 필요하지는 않습니다. 101,000 또는 98,500 dirs일 수 있으며, 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 ....(그리고 결과를 우리와 공유하세요 ☺)

관련 정보