目录的内容:
$ 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
答案 0 :(得分:3)
如何首先使用find来匹配所有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
如果您正在寻找最短的解决方案,请使用ls
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
与我的{{1}}:
{{1}}
答案 1 :(得分:3)
一种方式:
ls *[aA][vV][iI] | awk '{print tolower($0) " " substr($0,0,length($0)-3)"mpg";}'
答案 2 :(得分: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
答案 3 :(得分: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]
会解决此问题。