"sem"을 사용하여 스크립트를 병렬로 실행

"sem"을 사용하여 스크립트를 병렬로 실행

나는 정확히 동일한 내용을 가진 디렉토리를 식별하는 데 사용하고 싶은 다음 쉘 스크립트(한 줄)를 가지고 있습니다. 나는 이것을 중복된 (하위)디렉토리를 식별하고 제거하는 데 사용하고 있습니다.

을 사용하여 동일한 스크립트를 실행하려고 하면 오류가 sem발생합니다 .No such file or directory

예 - 병렬 스레드 없음

find -type d -links 2 | while read i; do \
   find "$i" -type f -print0 | xargs -r0 md5sum | awk '{ print $1 }' \
   | sort | md5sum | xargs -I {} echo {} $i ; \
   done

나에게주세요:

e94d32e2a683d46d49c7580d649f7888  - ./Daft Punk/Alive 2007 2
e94d32e2a683d46d49c7580d649f7888  - ./Daft Punk/Alive 2007

예 - sem 사용

find -type d -links 2 | while read i; do sem -j+0 \
   find "$i" -type f -print0 | xargs -r0 md5sum | awk '{ print $1 }' \
   | sort | md5sum | xargs -I {} echo {} $i ; \
   done; sem --wait

나에게주세요:

find: `./Daft': No such file or directory
find: `Punk/Alive': No such file or directory
find: `2007': No such file or directory
find: `2': No such file or directory
d41d8cd98f00b204e9800998ecf8427e  - ./Daft Punk/Alive 2007 2
find: `./Daft': No such file or directory
find: `Punk/Alive': No such file or directory
find: `2007': No such file or directory
d41d8cd98f00b204e9800998ecf8427e  - ./Daft Punk/Alive 2007

질문:

  1. 왜 행동의 차이가 있습니까?
  2. No such file or directory스크립트 에서 어떻게 sem제거/수정할 수 있나요?
  3. 스크립트에 추가로 개선할 수 있는 사항이 있나요? ( 많고 awk)xargs

답변1

가장 간단한 해결책은 sem에 전달된 명령을 인용하는 것입니다.

sem -j+0 "find \"$i\" -type f -print0"

이 예에서 차이점을 볼 수 있습니다.

$ sem -j 8 echo "a  a" 
a a
$ sem -j 8 'echo "a  a"' 
a  a

답변2

대신 병렬성을 사용하십시오.

doit() {
  i="$1"
  find "$i" -type f -print0 | xargs -r0 cat | md5sum |
    awk '{ print $1 }' |
    sort | md5sum
}
export -f doit
find -type d -links 2 | parallel --tag doit

관련 정보