[问题]怎样判断一个文件名里是否包含某些扩展名?

sh/bash/dash/ksh/zsh等Shell脚本
kingstar
帖子: 22
注册时间: 2006-02-28 22:30

[问题]怎样判断一个文件名里是否包含某些扩展名?

#1

帖子 kingstar » 2007-05-19 17:52

将某些扩展名的文件比如.txt/.c/.php的文件编码格式转换,写了个小脚本,但是有句不会写,goolge了半天也没搞明白,大家帮我看一下

代码: 全选

for i in *
do
    if $i的扩展名是 .txt/.c/.php   #这句不会写 
    then
        echo "change file $i"
        iconv -f gbk -t utf-8 $i -o "$i.tmp"
        rm -f $i
        mv "$i.tmp" $i 
    fi
done
有啥别的好方法也行,谢了
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#2

帖子 eexpress » 2007-05-19 18:22

for i in *txt *.c *.php
● 鸣学
stufever
帖子: 69
注册时间: 2007-03-11 17:48

#3

帖子 stufever » 2007-05-19 18:41

赞楼上,好思路
呵呵,我按照楼主的思路想了想,有这么个笨办法:
file 文件名 | awk -F ":" '{print $1}' |sed s'/.*\.//'
wkt
帖子: 849
注册时间: 2006-09-07 22:51
联系:

#4

帖子 wkt » 2007-05-19 18:58

stufever 写了:赞楼上,好思路
呵呵,我按照楼主的思路想了想,有这么个笨办法:
file 文件名 | awk -F ":" '{print $1}' |sed s'/.*\.//'
哪个sed能不能解释一下??
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#5

帖子 eexpress » 2007-05-19 19:30

如果要直接判断。应该这样
${i##*.}
别跑远路了。哈哈。
● 鸣学
kingstar
帖子: 22
注册时间: 2006-02-28 22:30

#6

帖子 kingstar » 2007-05-19 21:30

sed和${i##*.} 没看明白

我起初是想用grep来,但是除了第一个命令外,后面的正则表达式好像不好用

happy@happylinux:~$ echo "abc.php" | grep "php"
abc.php
happy@happylinux:~$ echo "abc.php" | grep "^[\w]+\.(php|css|txt|htm|html)$"
happy@happylinux:~$ echo "abc.php" | grep "(php|css)$"
happy@happylinux:~$ echo "abc.php" | grep "(php)$"
happy@happylinux:~$
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#7

帖子 eexpress » 2007-05-19 23:24

是这样的啊。

i=sljlskdjlk.slkjlweej; echo ${i##*.}
● 鸣学
stufever
帖子: 69
注册时间: 2007-03-11 17:48

#8

帖子 stufever » 2007-05-20 0:58

恩,呵呵,这个跟basename有点像哈!
stufever
帖子: 69
注册时间: 2007-03-11 17:48

#9

帖子 stufever » 2007-05-20 1:05

wkt 写了: 哪个sed能不能解释一下??
把从开始到"."的所有字符替换掉,用什么替换呢,//代表空,就是把它们都删掉。
stufever
帖子: 69
注册时间: 2007-03-11 17:48

#10

帖子 stufever » 2007-05-20 1:12

eexpress 写了:是这样的啊。

i=sljlskdjlk.slkjlweej; echo ${i##*.}
恩,好方法。
意思就是在字符串i中,把和.最远匹配前的所有字符都截断。
如果i=file.txt.exe,呵呵,输出结果应该是exe。
${i#*.}的话,输出应该事txt.exe,事最近匹配。
把#换成%事从后匹配。
kingstar
帖子: 22
注册时间: 2006-02-28 22:30

#11

帖子 kingstar » 2007-05-20 10:12

楼上几位都是高人啊

那能不能解释下 echo "abc.php" | grep "^[\w]+\.(php|css|txt|htm|html)$" 为什么没办法匹配呢?
搞不清楚心里总是不踏实
aBiNg
帖子: 1331
注册时间: 2006-07-09 12:22
来自: 南京

#12

帖子 aBiNg » 2007-05-20 10:29

kingstar 写了: 那能不能解释下 echo "abc.php" | grep "^[\w]+\.(php|css|txt|htm|html)$" 为什么没办法匹配呢?
搞不清楚心里总是不踏实
grep -e
kingstar
帖子: 22
注册时间: 2006-02-28 22:30

#13

帖子 kingstar » 2007-05-20 10:57

我曾试过-e,好像没啥用

happy@happylinux:~$ echo "abc.php" | grep "^[\w]+\.(php|css|txt|htm|html)$"
happy@happylinux:~$ echo "abc.php" | grep -e "^[\w]+\.(php|css|txt|htm|html)$"
happy@happylinux:~$ echo "abc.php" | grep -e "php"
abc.php
happy@happylinux:~$ echo "abc.php" | grep "php"
abc.php
happy@happylinux:~$
stufever
帖子: 69
注册时间: 2007-03-11 17:48

#14

帖子 stufever » 2007-05-20 11:15

kingstar 写了:我曾试过-e,好像没啥用

happy@happylinux:~$ echo "abc.php" | grep "^[\w]+\.(php|css|txt|htm|html)$"
happy@happylinux:~$ echo "abc.php" | grep -e "^[\w]+\.(php|css|txt|htm|html)$"
happy@happylinux:~$ echo "abc.php" | grep -e "php"
abc.php
happy@happylinux:~$ echo "abc.php" | grep "php"
abc.php
happy@happylinux:~$
哦,为什么要用grep呢?
我刚才man了一下:

代码: 全选

grep, egrep, fgrep, rgrep - print lines matching a pattern
也就是说它是打印一行,而不是从一个字符串中匹配某个部分
kingstar
帖子: 22
注册时间: 2006-02-28 22:30

#15

帖子 kingstar » 2007-05-23 0:01

[:alpha:]是可以的了,还没搞清楚

happy@happylinux:~$ echo "abc.php" | grep '^[[:alpha:]]\+\.\(php\|css\|txt\|htm\|html\)$'
abc.php
happy@happylinux:~$ echo "abc.php" | grep '^[\w]\+\.\(php\|css\|txt\|htm\|html\)$'
happy@happylinux:~$
回复