免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 14593 | 回复: 44
打印 上一主题 下一主题

[文件目录] bash中,如何准确判断某类型文件存在 [已解决] [复制链接]

论坛徽章:
1
摩羯座
日期:2014-07-16 14:52:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-15 09:03 |只看该作者 |倒序浏览
本帖最后由 bclly 于 2014-07-16 14:52 编辑

如题,我想判断字体文件是否存在当前目录下,在网上看到大神的一种方法:
  1. exists_pattern_files(){  
  2.     [ -e "$1" ]  
  3. }  
复制代码
(1)没有匹配此模式的文件;
[root@liunx0918 tmp2]# ls *.gif
ls: *.gif: 没有那个文件或目录
[root@liunx0918 tmp2]# exists_pattern_files *.gif && echo "*.gif exists" || echo "*.gif not exists"
*.gif not exists

(2)刚好有一个匹配此模式的文件;
[root@liunx0918 tmp2]# touch 1.gif
[root@liunx0918 tmp2]# ls *.gif
1.gif
[root@liunx0918 tmp2]# exists_pattern_files *.gif && echo "*.gif exists" || echo "*.gif not exists"
*.gif exists

(3)有多于一个匹配此模式的文件;
[root@liunx0918 tmp2]# touch 2.gif
[root@liunx0918 tmp2]# ls *.gif
1.gif  2.gif
[root@liunx0918 tmp2]# exists_pattern_files *.gif && echo "*.gif exists" || echo "*.gif not exists"
*.gif exists
[root@liunx0918 tmp2]#


现在有一个疑问:因为Linux是大小写区分的,那么,如果我修改了gif为GIF,那程序就找不到了,但是文件实际上存在,这个怎么办?


另外还有一个问题需要请教:
  1. #!/bin/bash
  2. if [ -f `pwd`/msyh.TTf ];
  3.   then
  4.   echo "msyh.ttf存在!"
  5.   if [ -f `pwd`/msyhbd.TTF ];
  6.      then
  7.          echo "msyhbd.TTF不存在!";
  8.   fi
  9.    else
  10.          echo "不存在,请先获取他们!"
  11.          read -n 1 -p "任意键退出本程序!"
  12.          exit 0;
  13. fi

复制代码
这样嵌套着写貌似不对:我测试了一下,发现:嵌套在里边的这段
  1. if [ -f `pwd`/msyhbd.TTF ];
  2.      then
  3.          echo "msyhbd.TTF不存在!";
  4.   fi
复制代码
就没办法执行,那如果我要判断两个文件都要存在,应该怎么写?

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2014-07-15 09:24 |只看该作者
回复 1# bclly

第一题:
  1. #!/bin/bash

  2. function exists_pattern_files(){
  3.     return `ls|grep -iq "\.gif"`
  4. }

  5. exists_pattern_files *.gif && echo "*.gif exists" || echo "*.gif not exists"

  6. [masonzhu@rat122 xxx]$ ls
  7. a1.db  a2.db  a3.db  a4.db  a5.db  abc.GIF  test.sh
  8. [masonzhu@rat122 xxx]$ ./test.sh
  9. *.gif exists
复制代码

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
3 [报告]
发表于 2014-07-15 09:28 |只看该作者
回复 2# Herowinter
这样写感觉就是只能判断以.gif为后缀的文件了?如果还是像LZ那种用参数输入后缀,觉得还是要在脚本ls一下用awk或sed将结果全部转成小写,然后再逐个匹配吧?我能想到只有这样

   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
4 [报告]
发表于 2014-07-15 09:36 |只看该作者
回复 3# Kasiotao

哦,我题审得不好,多谢指出,是要传参数的。
   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
5 [报告]
发表于 2014-07-15 09:37 |只看该作者
回复 1# bclly
第二题,好像你的代码也没问题,你只是打的log好像写反了。
可以改成这样。
  1. #!/bin/bash

  2. if [ -f `pwd`/msyh.TTf ] && [ -f `pwd`/msyhbd.TTF ];then
  3.     echo "TTF存在!"
  4. else
  5.     echo "不存在,请先获取他们!"
  6.     read -n 1 -p "任意键退出本程序!"
  7.     exit 0;
  8. fi
复制代码

论坛徽章:
39
双子座
日期:2014-08-06 17:37:19极客徽章
日期:2016-12-07 14:03:402017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之新疆
日期:2017-03-24 16:36:1915-16赛季CBA联赛之江苏
日期:2017-04-26 17:19:08黑曼巴
日期:2018-03-07 18:56:5615-16赛季CBA联赛之八一
日期:2018-03-09 10:44:1015-16赛季CBA联赛之江苏
日期:2018-03-12 15:12:1915-16赛季CBA联赛之青岛
日期:2018-03-16 09:13:0515-16赛季CBA联赛之山东
日期:2018-04-27 18:23:0515-16赛季CBA联赛之新疆
日期:2018-05-04 11:29:30
6 [报告]
发表于 2014-07-15 09:39 |只看该作者
回复 1# bclly


    我回答你第二个问题  
#!/bin/bash
  1. if [ -f `pwd`/msyh.TTf ];
  2.   then
  3.   echo "msyh.ttf存在!"
  4.   if [ -f `pwd`/msyhbd.TTF ];
  5.      then
  6.          echo "msyhbd.TTF不存在!";
  7.   fi
  8.    else
  9.          echo "不存在,请先获取他们!"
  10.          read -n 1 -p "任意键退出本程序!"
  11.          exit 0;
  12. fi
复制代码



你的语句结构是这样的
if   (第一个if)
条件1
then
动作1
if  (第二个if)
then
动作2
fi   (第二个if结束)
else
动作3
fi    (第一个if结束)

所以你无论怎么写   
执行的顺序是先执行第一个if
条件为真时执行动作1
否则执行动作3  
所以始终不会执行条件2

你可以尝试这样写
if [ -f `pwd`/msyh.TTf ] || [ -f `pwd`/msyhbd.TTF ];
     then
         echo "存在!";
  fi
   else
         echo "不存在,请先获取他们!"
         read -n 1 -p "任意键退出本程序!"
         exit 0;
fi


        不能确定语句是否没有问题



论坛徽章:
39
双子座
日期:2014-08-06 17:37:19极客徽章
日期:2016-12-07 14:03:402017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之新疆
日期:2017-03-24 16:36:1915-16赛季CBA联赛之江苏
日期:2017-04-26 17:19:08黑曼巴
日期:2018-03-07 18:56:5615-16赛季CBA联赛之八一
日期:2018-03-09 10:44:1015-16赛季CBA联赛之江苏
日期:2018-03-12 15:12:1915-16赛季CBA联赛之青岛
日期:2018-03-16 09:13:0515-16赛季CBA联赛之山东
日期:2018-04-27 18:23:0515-16赛季CBA联赛之新疆
日期:2018-05-04 11:29:30
7 [报告]
发表于 2014-07-15 09:42 |只看该作者
回复 5# Herowinter


    英雄中间用&&     貌似是并且吧。。。。

论坛徽章:
1
摩羯座
日期:2014-07-16 14:52:12
8 [报告]
发表于 2014-07-15 09:46 |只看该作者
回复 6# o枫叶o飘零

我就是要让 条件1 和 条件2 都同时成立;若其中一个不成立,那就执行不了后面的东西。你这个写法,是“或”,只要其中一个成立就完事了,这个和我要达到的目的不一样。还是谢谢你指点!

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
9 [报告]
发表于 2014-07-15 09:55 |只看该作者
回复 3# Kasiotao
如果改传入的参数$1,要改成这种模式呀*.[Gg][Ii][Ff],对于$1中的每一个字母,
都要改成大小写的形式,这样做会不会舍近求远了?

   

论坛徽章:
1
摩羯座
日期:2014-07-16 14:52:12
10 [报告]
发表于 2014-07-15 10:02 |只看该作者
回复 5# Herowinter


    谢谢指点!经测试,这个方法能用!就是要用&&

现在就剩下后缀名大小写判断的问题了,这个如果按照你写的,貌似也不行,传参数的话,函数我不会写,请问具体怎么写?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP