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が、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コマンドライン引数を使用してバッチ(たとえば)からスクリプトを実行できます。

おすすめ記事