1

目录内容:

$ ls | awk '1'
ala
cztery.AVI
dwa.AvI
Jeden.aVI
lupa.com
PIĘĆ.AVI
trzy.Avi
zero.avi

此命令打印:

$ ls | awk '$0=tolower($0){a=substr($0,1,length($0)-4)}{if(/avi$/){system("echo "$0" "a"\".mpg\"")}}'
cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi jeden.mpg
pięć.avi pięć.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg

如何改进上述命令?我想打印:

cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg
4

4 回答 4

3

如何使用 find first 来匹配所有avi文件:

$ find -iname "*.avi" -exec basename {} \; | awk -F. '{print tolower($1) ".avi", $1 ".mpg"}'
cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg

$ ls -1 # Use the -1 option of ls instead of ls | awk '1'
ala
cztery.AVI
dwa.AvI
Jeden.aVI
lupa.com
PIĘĆ.AVI
trzy.Avi
zero.avi

如果您正在寻找最短的解决方案,请使用Gurulsmy awk

ls *.[aA][vV][iI] | awk -F. '{print tolower($1)".avi",$1".mpg"}'
cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg
于 2012-12-10T13:40:43.567 回答
3

单程:

ls  *[aA][vV][iI] | awk '{print tolower($0) " " substr($0,0,length($0)-3)"mpg";}'
于 2012-12-10T14:21:21.247 回答
1

这是我使用的方法GNU awk

for i in *.[Aa][Vv][Ii]; do echo "$(echo $i | awk '{ print tolower($0), gensub(/...$/,"mpg","") }')"; done

结果:

cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg
于 2012-12-10T14:43:12.740 回答
1
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]如有必要,将解决此问题。

于 2012-12-10T15:13:02.813 回答