スクリプトが拡張子を2回追加する

スクリプトが拡張子を2回追加する

私は、.mov ファイルを .mp4 に変換する簡単な bash スクリプトを実行しています。これは 99% の確率でうまく機能しますが、時々スネアに当たって次のようなエラーが発生します。

ファイル /home/jgeoffrey/Documents/HomeMovie/Test/year1video.mov.mov そのようなファイルまたはディレクトリはありません

ご覧のとおり、何らかの理由でファイル拡張子がファイルの末尾に 2 回追加されています。実際のディレクトリに移動すると、そうではなく、そこには 1 回だけ存在します。

これが起こる原因は何ですか? また、どうすれば修正できますか? 以下はスクリプトです:

#Scanning Documents for any mov files
for f in $(find /home/jgeoffrey/Documents -type f -name "*.mov");
do
 #checking if a .mp4 exists
 mp4=${f%.mov}.mp4  
 #if no .mp4 exist convert the file
 if ! lsof $f && [ ! -e "$mp4" ];
 then
    #Converting the file to .mp4
    avconv -i $f.mov -codec copy $f.mp4
 fi
done

答え1

あなたのコマンドではfind

find /home/jgeoffrey/Documents -type f -name "*.mov"

.mov変数 を使用してファイルを検索し、反復処理していますf。したがって、変数の値に$fはすでに.movファイルが含まれています。たとえば、ファイルの 1 つが であるとしますfoo.mov

再び、 ではavconf入力ファイルを として使用したので$f.mov、ファイル名は次のようになります。

foo.mov.mov 

エラーの内容はまさにこれです:

year1ビデオ。動画.動画: そのようなファイル、又はディレクトリはありません

したがって、次のものが必要です:

avconv -i "$f" -codec copy "$mp4"

すでに削除されて追加された$mp4ファイル名が含まれています。.mov.mp4

また、ファイル名を含む変数を引用符で囲んでください。そうしないと、空白を含むファイル名の場合は失敗します。

また、改行で区切られたファイルリストをループする場合は、whileの代わりにを使用しますfor

find .... | while IFS= read -r f; do .....

関連情報