나는 정확히 동일한 내용을 가진 디렉토리를 식별하는 데 사용하고 싶은 다음 쉘 스크립트(한 줄)를 가지고 있습니다. 나는 이것을 중복된 (하위)디렉토리를 식별하고 제거하는 데 사용하고 있습니다.
을 사용하여 동일한 스크립트를 실행하려고 하면 오류가 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
질문:
- 왜 행동의 차이가 있습니까?
No such file or directory
스크립트 에서 어떻게sem
제거/수정할 수 있나요?- 스크립트에 추가로 개선할 수 있는 사항이 있나요? ( 많고
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