그래서 내 폴더에 압축을 풀고 모든 파일을 삭제해야 하는 .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
. 선형 방식으로 입력 목록을 따라 작업하므로 인터리빙은 원하는 방식으로 로드를 분산시켜야 합니다.