많은 수의 .wav 파일을 .mp3로 변환하는 쉘 스크립트를 작성하려고 합니다. 나는 "find" 명령을 사용하여 찾은 다음 "lame" 명령을 사용하여 변환합니다. 간단한 for 루프를 사용하여 이를 달성할 수 있지만 이를 달성하려면 여러 병렬 프로세스를 사용해야 합니다.
예를 들어 4와 같이 프로세스 수를 정의하고 싶습니다. 각 프로세스에서 파일 변환을 시작합니다. 하나의 프로세스에서 파일 변환이 완료되면 다음 파일로 대체합니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
답변1
특정 시간에 실행되는 프로세스 수를 제어하려면 목록을 전달하고 및/또는 옵션을 xargs
사용하는 것이 좋습니다.-n
-P
답변2
make
좋습니다. 당신은 Makefile
다음과 같은 것이 필요합니다
%.mp3: %.wav
lame $(LAMEOPTS) $< $@
그런 다음 대상 목록을 생성합니다.
$ find . -name '*.wav' -type f | sed -e 's/\(.*\.\)wav$/all: \1mp3/' >>Makefile
이제 make
스케줄러 작업에 다음을 알려주세요.
$ make -r -j4 -f Makefile
답변3
아직 아무도 GNU 병렬성을 언급하지 않았다는 사실에 놀랐습니다. 이를 사용하면 명령이 매우 간단해집니다.
find -type f -name '*.wav' -print0 | parallel -0 lame {} {.}.mp3
이를 위해서는 각 입력 파일의 확장자를 mp3
. -j <i>integer</i>
--dry-run 스위치는 어떤 명령이 실행될지 확인하는 데 유용합니다.
답변4
설치해 본 적이 있다면 xjobs
이것이 정확히 설계된 작업 유형임을 알게 될 것입니다. 특히 -j
생성되는 프로세스 수를 조정하려면 옵션 설명을 확인하세요.