私は、.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 .....