GNU 병렬 매개변수 동작이 이상해 보입니다.

GNU 병렬 매개변수 동작이 이상해 보입니다.

그래서 소스 디렉터리와 대상 디렉터리를 매개 변수로 사용하고 대상 위치에 동일한 디렉터리 구조를 만든 다음 소스의 모든 파일을 변환하여 해당 대상 디렉터리 GNU 병렬 명령에 넣는 간단한 스크립트를 만들어 보았습니다.

내 스크립트는 다음과 같습니다

#!/bin/bash
SOURCE=$1
DEST=$2
find $SOURCE -type f -name '*.flac' -printf "%P\n" | parallel --dry-run mkdir -p $DEST{//}
find $SOURCE -type f -name '*.flac' -printf "%P\n" | parallel --dry-run ffmpeg -loglevel info -i {} -codec:a libmp3lame -qscale:a 3 $DEST{/.}.mp3

엄청난! mkdir은 잘 작동합니다(예, mkdir은 각 파일에 대한 디렉토리를 생성하려고 시도하며 지금까지는 괜찮습니다).

그러나 ffmpeg 라인에서는 출력이 $DEST로 끝나지 않습니다. 실제로 $DEST는 --dry-run 출력에 표시되지 않기 때문에 비어 있는 것처럼 보입니다.

그래서 이 글을 작성할 때 아이디어가 떠올랐고 ffmpeg 라인을 단순화하여 대체하여 사용해 보았습니다.

find $SOURCE -type f -name '*.flac' -printf "%P\n" | parallel --dry-run echo {} $DEST{/.}.mp3

같은 행동을 보았습니다. 시원한. 그런 다음 다음과 같이 $DEST가 있는 곳으로 이동합니다.

find $SOURCE -type f -name '*.flac' -printf "%P\n" | parallel --dry-run echo {} {$DEST/.}.mp3

놀랍게도 $DEST를 {/.}로 옮기면 작동합니다! 그러나 MKDIR 사례(예: {$DEST//})에서 동일한 트릭을 시도하면 작동하지 않습니다.

그러면 MKDIR 사례에서는 $DEST{//}만 사용할 수 있고 단순화된 사례에서는 {$DEST/.}만 사용할 수 있는 이유는 무엇일까요?

감사해요!

답변1

그래서 대본을 계속 가지고 놀다보니 움직이는 과녁을 노리는 느낌이 들었어요. 변경 사항과 내용을 추적하지 않았으므로 다른 문제가 있을 수 있습니다.

하지만 제대로 작동하도록 스크립트를 수정했다고 생각합니다.

이 스크립트의 목표는 *.flac 및 *.jpg 파일이 포함된 임의의 소스 디렉터리를 가져와 대상 위치에 동일한 디렉터리 구조를 만든 다음 해당 소스의 모든 *.flac 파일을 다시 인코딩하고 *.mp3를 작성하는 것입니다. 마지막으로 소스 디렉터리의 모든 *.jpg(표지)를 해당 대상 디렉터리에 복사합니다. 가능할 때마다 GNU 병렬성을 사용하십시오.

TL;DR - 병렬성을 사용하여 FLAC 디렉토리 트리를 MP3 디렉토리 트리로 변환합니다.

이것이 내가 마침내 생각해 낸 것입니다.

#!/bin/sh
SOURCE=$1
DEST=$2
find $SOURCE -type f -name '*.flac' -printf "%h\n" | uniq | parallel --dry-run mkdir -p {=s:$SOURCE:$DEST:g=}
find $SOURCE -type f -name '*.flac' -printf "%P\n" | parallel --dry-run ffmpeg -loglevel info -i $SOURCE{} -codec:a libmp3lame -qscale:a 3 $DEST{.}.mp3
find $SOURCE -type f -name '*.jpg' -printf "%P\n" | parallel --dry-run cp $SOURCE{} $DEST{}

위에서 언급한 것처럼 적어도 --dry-run 출력에 대해서는 작동하는 것 같습니다. (재)사용하시기 바랍니다.

관련 정보