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 ,因为它在 shell 中很容易完成,但假设你有你的理由,这里是实现你发布的内容的正确方法:
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]如有必要,将解决此问题。