노틸러스에서 선택한 파일을 변환하기 위해 일부 사용자 정의 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
명령줄 인수를 사용하여 배치(예:)에서 스크립트를 실행할 수 있습니다.