ノーチラスで選択したファイルを変換するためのいくつかのカスタム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
が、2番目のスクリプトでは異なる動作をします。
ちなみに、これらの他のスクリプトは2番目のスクリプトと同じですが、フォルダ内のすべてのファイルに対して完全に機能するため、内部コマンドが機能すると確信してい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"
スクリプトが予想されるディレクトリで実行されていることを確認するには、上部の近くに1つを追加することをお勧めします。それ以外の場合は、処理中の値から関連ディレクトリを推測できます(に$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
コマンドライン引数を使用してバッチ(たとえば)からスクリプトを実行できます。