ls | awk '{lc=tolower($0)} lc~/\.avi$/{sub(/...$/,"mpg"); print lc,$0}'
これは、改行を含むファイル名では機能しないことに注意してください。そのような状況がある場合は、お知らせください。
以下のコメントで次のように述べています。
システムにこのコマンドを実行させたい ->
ls | awk '{a=substr($0,1,length($0)-4)}/avi$|AVI$/{system("ffmpeg -i "$0" -f avi -vcodec libxvid "a"\".mpg\"")}'
私が言ったように、それはそれについて正しい方法で考えていないだけです. 明示的にするために、これを行っています:
shell ( ls | awk ( system( shell ( ffmpeg ) ) ) )
これはもっと理にかなっていませんか:
shell ( ls | awk; ffmpeg )
すべてシェルで自明に行われているため、これに awk を使用している理由は実際にはわかりませんが、理由があると仮定すると、投稿したものを実装する正しい方法は次のとおりです。
ls *.avi *.AVI |
awk '{print $0, substr($0,1,length($0)-3) "\"mpg\""}' |
while read -r orig mpeg
do
ffmpeg -i "$orig" -f avi -vcodec libxvid "$mpeg"
done
ファイル名にスペースが含まれていると失敗することに注意してください。
ls *.avi *.AVI |
while IFS= read -r orig
do
ffmpeg -i "$orig" -f avi -vcodec libxvid "${orig%avi}mpeg"
done
ファイル名を小文字に変換するという最初の要件は、実装したいと述べたソリューションでは消えたことに注意してください。
また、この解決策は、実装することを望んでいたことに基づいているため、最初に投稿されたファイルのリストでは機能しないことに注意してください.Aviではなく.aviまたは.AVIで終わるファイルに対してのみ機能するためです。ls *.[Aa][Vv][Ii]
必要に応じて修正します。