web-dev-qa-db-ja.com

basenameが期待どおりに機能しない

ターゲットファイル名で「.mkv」を非表示にするにはどうすればよいですか?

$ echo a/b.mkv | xargs -I % echo ffmpeg -i "%" $(basename "%" ".mkv").mp4
ffmpeg -i a/b.mkv a/b.mkv.mp4
2
forthrin

これはbasenameとは関係ありませんが、basename "%" ".txt"実行が早すぎます。試してみてください:

echo a/b.mkv | xargs -I % sh -c 'echo ffmpeg -i "%" $(basename "%" ".mkv").mp4'

basenameの主な目的は、ディレクトリ部分を削除することです。GNU basename(1)のマニュアルページには、「ファイル名からディレクトリとサフィックスを削除する」と書かれています。ディレクトリ部分を保持したい場合:

echo a/b.mkv | xargs -I % sh -c 'echo ffmpeg -i "%" $(dirname "%")/$(basename "%" ".mkv").mp4'

sedなどの他の解決策があります。例えば:

$ echo a/b.mkv | sed 's/\.mkv$/.mp4/'
a/b.mp4
2
vinc17