`

在Linux下怎么用Bash判断是否存在某种模式的文件名

阅读更多

问:在Linux下怎么用Bash判断是否存在某种模式的文件名?

比如,用脚本判断是否有 *_codec.* 形式的文件名,或者有 *.gif 形式的文件名。

 

答:

方法一:

[ "$(ls *.gif 2>/dev/null)" ] && echo "*.gif exists" || echo "*.gif not exists"

方法二:

exists_pattern_files(){
    [ -e "$1" ]
}

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

 

探索过程:

 

用 test -e file 或 [ -e file ] 只能判断单个确定名称的文件,如果是通配符模式指定的文件名,这种方式就不凑效了。

有三种情况需要考虑到:

(1)没有匹配此模式的文件;

(2)刚好有一个匹配此模式的文件;

(3)有多于一个匹配此模式的文件;

 

下面以 *.gif 模式来测试:

(1)没有匹配此模式的文件;

[root@liunx0918 tmp0]# ls *.gif
ls: *.gif: 没有那个文件或目录
[root@liunx0918 tmp0]# [ -e *.gif ] && echo "*.gif exists" || echo "*.gif not exists"
*.gif not exists
[root@liunx0918 tmp0]#

(2)刚好有一个匹配此模式的文件;

[root@liunx0918 tmp0]# touch 1.gif
[root@liunx0918 tmp0]# ls *.gif
1.gif
[root@liunx0918 tmp0]# [ -e *.gif ] && echo "*.gif exists" || echo "*.gif not exists"
*.gif exists
[root@liunx0918 tmp0]#

(3)有多于一个匹配此模式的文件;

[root@liunx0918 tmp0]# touch 2.gif
[root@liunx0918 tmp0]# ls *.gif
1.gif  2.gif
[root@liunx0918 tmp0]# [ -e *.gif ] && echo "*.gif exists" || echo "*.gif not exists"
-bash: [: 1.gif: binary operator expected
*.gif not exists
[root@liunx0918 tmp0]#

 

前面两种情况,还可以判断,第三种情况脚本就会报错,谁又能保证匹配的文件不会多于一个呢?

 

首先想到:可以用 ls 命令先列出该模式文件的输出进行判断。如下所示:

(1)没有匹配此模式的文件;

[root@liunx0918 tmp1]# ls *.gif
ls: *.gif: 没有那个文件或目录
[root@liunx0918 tmp1]# [ "$(ls *.gif)" ] && echo "*.gif exists" || echo "*.gif not exists"
ls: *.gif: 没有那个文件或目录
*.gif not exists
[root@liunx0918 tmp1]#

注意上面标记为红色的内容,其实脚本中不希望看到这个信息,这个信息是输出在标准错误输出的,用下面的方法可以

[root@liunx0918 tmp1]# [ "$(ls *.gif 2>/dev/null)" ] && echo "*.gif exists" || echo "*.gif not exists"
*.gif not exists
[root@liunx0918 tmp1]#

(2)刚好有一个匹配此模式的文件;

[root@liunx0918 tmp1]# touch 1.gif
[root@liunx0918 tmp1]# ls *.gif
1.gif
[root@liunx0918 tmp1]# [ "$(ls *.gif 2>/dev/null)" ] && echo "*.gif exists" || echo "*.gif not exists"
*.gif exists
[root@liunx0918 tmp1]#

(3)有多于一个匹配此模式的文件;

[root@liunx0918 tmp1]# touch 2.gif
[root@liunx0918 tmp1]# ls *.gif
1.gif  2.gif
[root@liunx0918 tmp1]# [ "$(ls *.gif 2>/dev/null)" ] && echo "*.gif exists" || echo "*.gif not exists"
*.gif exists
[root@liunx0918 tmp1]#

 

忽然灵光一闪,既然可以通过ls列举文件的方式来进行,其实Bash本身就支持文件名通配符展开,不妨来写个简单的函数

exists_pattern_files(){
    [ -e "$1" ]
}
 

[root@liunx0918 tmp2]# exists_pattern_files(){
> [ -e "$1" ]
> }

注意,把文件名模式作为参数传递给此函数(不带任何引号),Bash就会自动展开文件模式,有多少个匹配的文件就会有多少个参数,而模式本身不会当做参数传递给函数;

如果没有匹配的文件名称,把模式本身传递给函数。而这个函数的实现部分相当简单,只需要对第一个参数指定的文件进行判断即可,为了保险起见,带上双引号。

(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]#

 

本文链接:http://codingstandards.iteye.com/blog/1183303

 

下面贴一下我所需要的脚本内容。

对当前目录下各个子目录判断,如果子目录中包含*_codec.*形式的文件,就执行指定的动作。

 

实现一:

for d in *
do
        FILES=$(ls $d/*_codec.* 2>/dev/null)
        if [ "$FILES" ]; then
                #echo "$d" "[$FILES]"
                (cd $d; make msg)
        fi
done

 

实现二:

exists_pattern_files(){
    [ -e "$1" ]
}

for d in *
do
        if exists_pattern_files $d/*_codec.*; then
                #echo "$d" "[$FILES]"
                (cd $d; make msg)
        fi
done
3
0
分享到:
评论

相关推荐

    批量修改或替换文件名中的字符,可修改扩展名

    - 对于程序员或者有一定技术背景的用户,可以使用命令行工具(如Windows的`cmd`或`PowerShell`,Linux的`bash`,Mac的`Terminal`)配合正则表达式进行批量改名,或者编写脚本(Python、Bash、批处理脚本等)实现...

    bash shell 基础编程语法

    Linux下的shell并非只有单一形式,而是存在多种不同的shell类型,如Korn Shell (`ksh`)、Bourne-Again Shell (`bash`)、C Shell (`csh`)等。这些shell各有特点,但最常见且广泛使用的是`bash`。在`bash`中,普通用户...

    Linux下生成core dump

    在Linux环境下,当一个程序因为某种原因(如段错误)而崩溃时,系统可以自动为该程序创建一个名为“core dump”的文件。这个文件包含了程序崩溃时内存的快照,可用于后续分析问题的原因。在本文档中,我们将详细探讨...

    Python-BashInfinity是bash的一个现代的样板框架标准库

    其中,Bash(Bourne-Again SHell)作为Linux和Unix系统中最常用的命令行解释器,因其简洁和强大的功能而广受欢迎。然而,随着项目的复杂性增加,传统的Bash脚本可能会变得难以维护。为了解决这个问题,"Python-...

    Linux下安装java

    在Linux环境下安装Java是许多开发者和系统管理员的基本任务,无论是为了开发Java应用程序,还是为了运行基于Java技术的服务器。在本篇文章中,我们将深入探讨如何在Linux系统上安装Java,包括从源码编译和使用预编译...

    linux下将qq聊天记录分开存储及倒序

    在Linux环境下,管理和操作文件是日常工作中不可或缺的一部分。在这个场景中,我们主要关注的是如何使用shell脚本处理QQ聊天记录,将其按照不同的QQ号码分开存储,并实现倒序排列。这涉及到Linux shell脚本编程的...

    批量修改文件名

    - Bash:Linux和macOS的命令行脚本语言,使用for循环和mv命令也能实现批量改名。 四、批量修改文件名的注意事项 1. 备份文件:在进行批量重命名前,确保对原始文件有备份,以防误操作导致数据丢失。 2. 避免覆盖...

    data1_linux_zip_

    在Linux操作系统中,管理和操作文件是日常工作中必不可少的技能,特别是在处理压缩文件时。"data1_linux_zip_"这个标题暗示了我们将讨论与Linux系统中使用zip命令相关的知识点,特别是如何监控服务并压缩数据。"data...

    dnw for linux for 6410 for myself

    描述中的“我自己用的linux下的dnw,6410开发”进一步确认了这个版本的DNW是用户个人在Linux环境下进行6410开发时使用的。6410开发可能涉及到嵌入式系统开发,其中6410可能是某种嵌入式处理器或开发板型号。在这样的...

    [转] linux 运行 QQ2009

    标题中的“[转] Linux 运行 QQ2009”指的是在Linux操作系统中通过某种方式来运行腾讯QQ2009版本的教程或者方法。Linux通常不直接支持Windows平台的应用程序,但可以通过一些工具来实现对这些软件的兼容运行。 在...

    linux 学习资料

    在Linux环境下,开发者通常使用GCC或Clang进行C++编程。不过,APS和CLW不是标准的Linux文件格式,可能需要特定的IDE或编译器才能处理。学习Linux时,理解编译、链接和调试C++程序的过程至关重要,这包括使用`gcc/g++...

    恢复LINUX权限

    在 Linux 中还存在一些特殊的权限位,例如 SetUID (SUID) 和 SetGID (SGID)。这些特殊权限位允许一个普通用户以文件所有者的身份执行文件。例如,要使 `/usr/bin/passwd` 和 `/usr/bin/su` 命令具有 SUID 权限,可以...

    Linux操作系统

    1. **安全性**:Linux系统的权限管理严格,采用多用户模式,每个用户都有自己的权限范围,这使得Linux相对其他操作系统更加安全。 2. **稳定性**:Linux内核设计精良,经过长时间的优化和测试,具有很高的稳定性和...

    Linux下core文件调试方法.pdf

    下面我们将详细探讨Linux下core文件的生成、配置和使用方法。 1. **core文件简介** 当一个程序由于某种原因(如段错误、除零错误等)崩溃时,系统默认可能会生成一个core文件。这个文件包含了程序崩溃时的内存快照...

    嵌入式Linux应用开发-实验.rar_coverqmf_linux_told5nn

    5. **系统服务与脚本**:在Linux系统上设置和管理服务(如Systemd)以及编写bash脚本,能实现自动化任务和系统管理,这部分也可能是实验内容。 6. **调试与优化**:学习如何使用GDB进行远程调试,理解性能分析工具...

    linux-marysueencoder把任意文字和玛丽苏体的姓名进行加密转换

    下面将详细介绍这个工具的功能、工作原理以及如何在Linux环境下使用它。 首先,我们需要理解什么是“玛丽苏体”。玛丽苏(Mary Sue)源自西方同人小说文化,通常指代一种过于完美、不切实际的角色设定,这类角色...

    shell脚本可配置化读取文件夹中文件名称.rar

    在IT行业中,shell脚本是一种强大的工具,尤其在Linux或Unix系统中,它允许用户自动化执行一系列命令。本文将深入探讨如何使用shell脚本来实现可配置化的文件夹中文件名称读取,这对于日常的文件管理和自动化任务至...

    快乐的linux命令行

    - **为什么使用命令行**:在Linux环境中,命令行界面(CLI)提供了一种高效、直接与系统交互的方式。相较于图形用户界面(GUI),命令行允许用户通过简单的文本命令来完成复杂任务,如文件管理、进程监控等。它特别...

    嗜睡的理发师。。。。。。。

    标题中的“嗜睡的理发师”似乎是一种隐喻或编程问题的代号,但在这个上下文中,它与LINUX代码相关。描述并没有提供太多具体信息,因此我们需要从标签和文件名来推测可能的知识点。 标签“理发师”可能指的是一个...

    批量rename

    在Linux或Mac中,可以使用`mv`命令结合`find`或`bash`脚本来实现批量rename。 2. **图形界面工具**:对于不熟悉命令行的用户,有许多图形界面工具提供批量重命名功能。例如,Windows有`Bulk Rename Utility`,Mac有...

Global site tag (gtag.js) - Google Analytics