gnu 병렬: 파일 이름에 인용된 인수와 공백이 있습니다. 그것을 처리하는 방법?

gnu 병렬: 파일 이름에 인용된 인수와 공백이 있습니다. 그것을 처리하는 방법?

이것이 나를 미치게 만든다.

사용하고 싶은 mp3가 잔뜩 있습니다 ffmpeg.

다음 줄을 사용하려고 합니다(스크립트가 더 크고 이것이 문제가 되는 부분입니다).

find . -type f \( -iname \*.mp3 \) | parallel ffmpeg -i "{}" -acodec libmp3lame -ab 128k "$output_folder_with_spaces/{.}-128k.mp3" \;

iname( 향후 더 많은 확장이 사용될 수 있기 때문에 이 섹션이 존재합니다)

하지만 따옴표를 붙여도 mp3의 이름이 이기 때문에 {}항상 그런 말을 듣습니다 . 그것도 효과가 있을지 모르겠습니다 .No such file or directory01 - My song"$output_folder_with_spaces"

Google에서 많이 검색했지만 다음 예를 찾을 수 없습니다. 공백을 포함하려면 {}from을 사용하세요 . 변수나 하드코딩된 경로를 따옴표로 묶어 사용할 때만 이 사실을 발견했습니다.find{}

이 경우 공간 문제를 어떻게 해결할 수 있는지 아시는 분 계신가요?

답변1

잘못된 대체 문자열을 사용하고 있습니다 parallel. 인용된 인수도 전달해야 하며 후행이 무엇인지 -q잘 모르겠습니다 ... 예:\;

dirname_with_spaces="/home/don/my dir with spaces/"

/( 에 할당된 경로의 후행을 참고하세요 dirname_with_spaces) 그리고 디렉토리 mp3에 공백이 있는 일부 파일 이름은 test바로 여기 있습니다 cwd.

./test/Commercial DEMO - 09.mp3
./test/Commercial DEMO - 11.mp3
./test/Handel Royal Fireworks - 07.mp3
./test/Jazz Rag Ensemble - 10.mp3
./test/Mouret - Rondeau.mp3

사용

find . -type f -iname \*.mp3 | parallel -q ffmpeg -i {} -acodec \
libmp3lame -ab 128k "$dirname_with_spaces"{/.}-128k.mp3

다음 파일이 생성됩니다.

/home/don/my dir with spaces/Commercial DEMO - 11-128k.mp3
/home/don/my dir with spaces/Commercial DEMO - 09-128k.mp3
/home/don/my dir with spaces/Handel Royal Fireworks - 07-128k.mp3
/home/don/my dir with spaces/Jazz Rag Ensemble - 10-128k.mp3
/home/don/my dir with spaces/Mouret - Rondeau-128k.mp3

명령줄 quoting( ) 및 다음 명령 parallel -q의 사용에 유의하십시오.

{}
    Input line.

find이는 다음과 같은 출력의 경로를 의미합니다 ./test/Mouret - Rondeau.mp3
.

{/.}
    Basename of input line without extension. 

확장 Mouret - Rondeau다음 "$dirname_with_spaces"{/.}으로 확장/home/don/my dir with spaces/Mouret - Rondeau

후자는 {.}명령에 사용된 것과 상당히 다릅니다.

{.}
    Input line without extension.

그것은 확장될 것이고 ./test/Mouret - Rondeau, 그 다음에 "$dirname_with_spaces"{.}는 확장될 것입니다 /home/don/my dir with spaces/./test/Mouret - Rondeau. 분명히 이것은 /./test/under 가 없기 때문에 잘못될 것입니다 /home/don/my dir with spaces.

답변2

find구문을 잘못 이해했습니다 . 이 {}구문은 와 함께 사용됩니다 -exec. 또한 해당 괄호는 필요하지 않습니다. 기본 작업 순서를 재정의하려는 경우에만 필요합니다(예: 왼쪽에서 오른쪽으로 평가하지 않음). 전반적으로 exec의 경우 다음과 같습니다(가로 스크롤을 피하기 위해 분할).

find . -type f -iname \*.mp3 -exec \
    ffmpeg -i "{}" -acodec libmp3lame -ab 128k \
    "$output_folder_with_spaces/{}-128k.mp3" \;

이것은 당신에게 foo.mp3-128.mp3...이라는 파일을 제공할 것입니다. 이것이 당신이 원하는 것이기를 바랍니다. 이것이 무엇을 의미하는지 전혀 모릅니다 {.}. 적어도 GNU find의 경우 유효한 구문이 아닙니다.

lameFFmpeg를 통하기보다는 직접 사용하는 것이 좋습니다 ( -abVBR 모드 대신 ABR 모드를 사용하는 경우 정당한 이유 없이 사용하지 않는 것이 좋습니다). 실제로 MP3를 다시 인코딩하지 않는 것이 좋습니다. 무손실 소스에서 인코딩하면 동일한 비트 전송률로 더 나은 품질을 얻을 수 있습니다.

관련 정보