그래서 소스 디렉터리와 대상 디렉터리를 매개 변수로 사용하고 대상 위치에 동일한 디렉터리 구조를 만든 다음 소스의 모든 파일을 변환하여 해당 대상 디렉터리 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 출력에 대해서는 작동하는 것 같습니다. (재)사용하시기 바랍니다.