두 폴더 모두에서 .lzo 파일을 병렬로 추출한 다음 원본 .lzo 파일을 삭제합니다.

두 폴더 모두에서 .lzo 파일을 병렬로 추출한 다음 원본 .lzo 파일을 삭제합니다.

그래서 내 폴더에 압축을 풀고 모든 파일을 삭제해야 하는 .lzo파일이 있습니다 . 폴더에서도 동일한 작업을 수행해야 합니다 . 두 폴더 모두에 약 150개의 파일이 있으며 총 약 300개의 파일이 있습니다 ./test01/primary.lzo/test02/secondary.lzo.lzo

명령줄에서 다음과 같이 압축되지 않은 파일을 실행했습니다 lzop -d file_name.lzo.

.lzo모든 파일의 압축을 풀고 .lzo동시에 두 폴더의 모든 파일을 삭제하는 가장 빠른 방법은 무엇입니까? 아래는 내 코드입니다.

#!/bin/bash

set -e

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary

parallel lzop -dU -- ::: {"$PRIMARY","$SECONDARY"}/*.lzo

.lzo메인폴더와 보조폴더의 파일을 동시에 압축해제와 삭제를 하고 싶습니다 . 위의 코드를 사용하면 먼저 PRIMARY 폴더에서 실행된 다음 SECONDARY 폴더에서 실행됩니다. PRIMARY와 SECONDARY 모두에서 병렬성을 달성하는 방법은 무엇입니까?

그리고 모든 파일의 압축을 풀고 나중에 삭제하는 건가요, 아니면 한 파일의 압축을 풀고 해당 파일을 삭제하고 다음 파일로 넘어가는 건가요?

나는 이것을 시도했지만 작동하지 않습니다. 처음 40개 파일에 대해서만 작동하고 그 이후에는 전혀 작동하지 않습니다.

#!/bin/bash

set -e

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary

parallel -j 40 lzop -dU -- ::: "$PRIMARY"/*.lzo &
parallel -j 40 lzop -dU -- ::: "$SECONDARY"/*.lzo &
wait

답변1

내가 올바르게 이해했다면 두 디렉터리를 모두 병렬화하면서 (아마도) 두 저장 장치 사이의 로드 균형을 맞추고 싶습니까?

가장 간단한 해결책은 아마도 입력의 파일 이름을 병렬로 인터리브하는 것입니다.

paste -d'\n' <(ls "$PRIMARY"/*.lzo) <(ls "$SECONDARY"/*.lzo) | parallel lzop -dU --
  • paste명령은 각 파일에서 한 줄을 가져와 일반적으로 출력 파일에 나란히 배치하지만 여기서는 \n구분 기호로 사용하여 엇갈린 줄로 끝납니다.

  • <(...)bash 구문은 한 명령의 출력을 마치 파일인 것처럼 다른 명령으로 "파이프"하므로(임시 명명된 파이프를 사용하는 것 같습니다) 한 번에 두 개의 입력을 파이프할 수 있습니다.

  • 지정되지 않은 경우 병렬은 stdin에서 파일 이름을 읽고, :::지정되지 않은 경우 CPU당 하나의 작업을 실행합니다 -j. 선형 방식으로 입력 목록을 따라 작업하므로 인터리빙은 원하는 방식으로 로드를 분산시켜야 합니다.

관련 정보