bash 스크립트를 선택한 파일에만 적용하도록 설정(Nautilus)

bash 스크립트를 선택한 파일에만 적용하도록 설정(Nautilus)

노틸러스에서 선택한 파일을 변환하기 위해 일부 사용자 정의 bash 스크립트를 만드는 방법을 프로그래밍 배경 지식 없이 배우려고 하는데 이해할 수 없는 문제에 직면했습니다.

참고로 실제로 작동하는 스크립트는 다음과 같습니다. 선택한 .MP4 파일을 .mkv로 변환하고 타임스탬프를 복사한 후 일부 피드백을 사용자에게 인쇄합니다.

#!/bin/bash

for i in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do 
    ffmpeg -i "$i" -movflags use_metadata_tags -c:v libx265 -crf 26 -preset slow -c:a aac -b:a 160k "${i%.*}.mkv" && touch -r "$i" "${i%.*}.mkv" && notify-send "Converted '$(basename "$i")'" || notify-send "Failed converting '$(basename "$i")'"
done

notify-send "Conversion finished"

이제 이것은 작동하지 않는 스크립트입니다. 선택한 .m4a 파일을 .mp3로 변환하고, 표지 이미지와 일부 태그를 추가하고, 타임스탬프를 복사하고 사용자에게 피드백을 제공해야 합니다.

#!/bin/bash

for i in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do 
    ffmpeg -i "$i" "${i%.*}.mp3" && eyeD3 -a "Author" -A "Album" --add-image="cover.jpg":FRONT_COVER "${i%.*}.mp3" && touch -r "$i" "${i%.*}.mp3" && notify-send "Converted '$(basename "$i")'" || notify-send "Failed converting '$(basename "$i")'"
done

notify-send "Conversion finished"

이것을 실행하면 폴더 및 파일 이름 부분과 같은 파일 경로의 특정 부분에 대해 "변환 실패(파일 경로의 일부)"라는 오류가 여러 번 발생합니다.

여기서 내가 무엇을 다르게 하고 있는지 잘 모르겠습니다. 동일한 매개변수를 사용 $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS하지만 두 번째 스크립트에서는 다르게 작동합니다.

참고로 이 다른 스크립트는 두 번째 스크립트와 동일하지만 폴더의 모든 파일에 대해 완벽하게 작동하므로 내부 명령이 do작동한다고 확신합니다.

#!/bin/bash

for i in *.m4a
do 
    ffmpeg -i "$i" "${i%.*}.mp3" && eyeD3 -a "Author" -A "Album" --add-image="cover.jpg":FRONT_COVER "${i%.*}.mp3" && touch -r "$i" "${i%.*}.mp3" && notify-send "Converted '$(basename "$i")'" || notify-send "Failed converting '$(basename "$i")'"
done

notify-send "Conversion finished"

내가 무엇을 놓치고 있나요? $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS특정 파일 형식 만 처리할 수 있나요 ? 문제가 다른 곳에 있습니까?

답변1

이것이 실패한 스크립트를 다시 작성하는 방법입니다. 테스트할 수는 없지만 스크립트가 실행되는 디렉터리가 명확하지 않다는 점이 우려됩니다. 정말 존재하나요 cover.jpg?

notify-send "$PWD"스크립트가 예상 디렉터리에서 실행되고 있는지 확인하려면 상단 근처에 하나를 추가하는 것이 좋습니다 . 그렇지 않은 경우 처리 중인 값에서 관련 디렉토리를 유추할 수 있습니다 ( 로 $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS변경해야 할 수도 있음 )."cover.jpg""${src%/*}/cover.jpg"

#!/bin/bash
count=0 success=0

# Transform command line arguments (if provided)
[[ -z "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]] &&
    NAUTILUS_SCRIPT_SELECTED_FILE_PATHS=$(printf "%s\n" "$@")

# Process each file in turn
while IFS= read -r src
do
    # Target
    dst="${i%.*}.mp3"

    # Primary conversion to mp3
    step=0
    ffmpeg -i "$src" "$dst" && ((step++))

    # Add album cover (if available)
    if [[ step -eq 1 ]]
    then
        if [[ -f "cover.jpg" ]]
        then
            eyeD3 -a "Author" -A "Album" --add-image="cover.jpg":FRONT_COVER "$dst" && ((step++))
        else
            ((step++))
        fi
    fi

    # Reset the timestamp
    if [[ step -eq 2 ]]
    then
        touch -r "$src" "$dst" && ((step++))
    fi

    # Notify the user
    if [[ step -eq 3 ]]
    then
        notify-send "Converted '${src##*/}'"
        ((success++))
    else
        notify-send "Failed converting '${src##*/}' at step $step"
    fi

    # Count it
    ((count++))

done <<<"$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"

[[ count -gt 1 ]] &&
    notify-send "Conversion finished ($success files of $count)"

exit $((count - success))

notify-send통화를 보호하기 위해 비슷한 것을 사용할 수도 있지만 [[ -n "$DISPLAY" ]] && notify-send …확실하지는 않습니다. 그러면 at명령줄 인수를 사용하여 배치(예:)에서 스크립트를 실행할 수 있습니다.

관련 정보