在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
Ceres-solver examples之pose_graph_3d学习笔记 Ceres-solver examples之pose_graph_3d学习笔记简要说明变量说明关键步骤一、Costfunction的搭建其中包括:二、构造Problem 简要说明 ceres-solver库是google的非线性优化库,可以对slam问题,机器人位姿进行优化,使其建图的效果得到改善。pose_graph_3d是官方给出的二维平面上机器人位姿优化问题,需要读取一个g2o文件,运行程序... 阅读详情

相关推荐

用GraphPad Prism直出单细胞亚群堆叠柱状图

用GraphPad Prism直出单细胞亚群堆叠柱状图

fivehuge的博客 4195

Linux shell判断含有通配符的文件是否存在

方法一: 使用 ls ./*.jpg &> /dev/null 命令: if ! ls ./*.jpg &> /dev/null; then echo "当前文件夹下,未找到*.jpg文件!" else echo "当前文件夹下,存在*.jpg文件!" fi 方法二: 使用 ls *.jpg >/dev/null 2>&1 命令: if ! ls *.jpg >/dev/null 2>&1; then echo "当前文

清晨的光明 4803

高德地图爬虫

高德地图爬虫 工具:Pycharm,win10,Python3.6.4 1.需求分析 这篇爬虫和上一篇百度地图爬虫要求一样,百度地图爬虫我发现有一个auth参数会一直变化,一旦变化则获取的数据是不准确的,所以我上高德地图看了一下,高德地图没有这个反爬机制。但是高德地图大概爬取120个页面就会跳一次验证码,我这里是通过换IP解决这个问题的。 2.数据准备 同样我们需要全国地级市信息,用之前...

123的博客 1万+

Linux bash 判断当前路径下的文件名是否含指定字符

在bash中,使用“ =~ ”进行字符包含的判断。 看例子: 需求:判断路径中是否含zip压缩文件,若有则将其解压。 该需求需判断ls中的文件是否包含".zip"关键字 首先使用 FILES=$(ls) 绑定当前路径下的文件名,存为list到FILES中 再使用for循环遍历 FILES for FILE in $FILES do if [[ $FILE =~ ".zip" ]] ...

Irvinfaith的博客 5559

VSCode + Latex 配置

1. 安装VSCode VSCode下载 next,next就安装好了。 2. 配置VSCode 2.1 安装LaTeX Workshop插件 install,安装LaTeX Workshop插件 2.2 修改 user setting 点击左下角,进入用户设置 点击上图标记的部分,选择 打开settings.json 具体配置文件如下: { "latex-workshop.la...

一只特立独行的猪 10万+

Cadence Virtuoso Layout 版图绘制

画好原理图,打好pin脚(pin最好以全大写的形式书写,以防后续操作中可能出现Bug) 查看所使用工艺库的design rule文件,确定栅格单位设置大小 在准备绘制的原理图界面启动layout XL/GXL 在layout界面按e,设置网格大小与design rule匹配 直接根据原理图生成版图 根据原理图连接关系显示版图中未连接的飞线 查看和更改原理图与版图中器件对应的链接关系 shift + f:显示器件版图细节 版图的构成:元器件(工艺厂商提供)、器件连接、阱连接、IO和PAD模拟电路

bobo_supper的博客 2万+

shell 如何判断某个文件名以某个字符开头

问题:shell 如何判断某个文件名以某个字符开头~ 解决: #var="cn get the length of me" #$1: parameter 1 传要判断的文件名字 var=$1 isCN=false #${var:0:2} 取var子串,从第0个字符起,取2两个字符 if [[ ${var:0:2} -eq "cn" ]] then echo sub is 

wwamiss的专栏 2553

手把手教你用Isograph Reliability Workbench 14.0绘制可靠性方框图(RBD)

本文详细介绍了如何使用Isograph Reliability Workbench 14.0绘制可靠性方框图(RBD),从软件安装、界面设置到基础项目创建和高级功能应用,手把手指导工程师完成系统可靠性分析。通过实际案例演示,帮助用户掌握RBD建模技巧,提升系统可靠性评估效率。

weixin_26765287的博客 620

shell提取文件后缀名,并判断其是否为特定字符串

# for ".css" ".js" file if [ "${file##*.}"x = "css"x ]||[ "${file##*.}"x = "js"x ];then     do something fi

Hellovictoria的专栏 2万+

OpenStack [ compute_id ] 设计上的小缺陷

而 nova 代码中硬编码(或默认配置)将 compute_id 放在 site-packages 目录,属于 设计上的小缺陷—— 把 “库安装目录” 和 “运行时数据目录” 混在一起了,才导致需要临时调整这个目录的权限。# 配置项说明:node_identity_file 是 nova 用于指定节点标识文件路径的官方配置项,优先级高于代码中的默认路径。自定义 compute_id 路径,指向 /var/lib/nova/ 目录下的 compute_id 文件;

求知若渴,虚心若愚。 491

OP-TEE虚拟化支持详解

OP-TEE虚拟化支持解析 OP-TEE提供实验性虚拟化方案,支持多虚拟机共享安全执行环境。核心特性包括: 配置选项:CFG_VIRTUALIZATION启用虚拟化,CFG_VIRT_GUEST_COUNT限制虚拟机数量并分配均等内存资源; Hypervisor协作:需实现虚拟机生命周期通知、SMC参数转换、内存固定等关键协议; 当前限制:仅支持Armv8架构,硬件资源共享有限,采用静态内存配额机制; 架构实现:通过MMU分区切换和扩展内存分配器实现多租户隔离,Nexus核心层管理虚拟机上下文。该方案适用于

Linux内核架构师 109

shell 如何判断某个文件名以某个字符开头~

问题:shell 如何判断某个文件名以某个字符开头~解决:#var="cn get the length of me"#$1: parameter 1 传要判断的文件名字var=$1isCN=false#${var:0:2} 取var子串,从第0个字符起,取2两个字符if [[ ${var:0:2} -eq "cn" ]]thenecho sub is  chinese ${var:0:2}els

snow365的专栏 3万+

Java高频面试基础问题与知识点整理

Java高频面试知识点总结:覆盖高频基础知识考点+高频集合知识点深入分析+高频多线程与并发编程面试题汇总+其他扩展考察等。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

linux bash shell 判断变量是否在列表中

1. 语法 双中括号[[]]是bash shell中的关键词,相对于[]有以下特点和优势: [[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]...

whatday的专栏 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux bash文件_如何检查Linux Bash中是否存在文件?

linux bash文件Linux bash have different file and directory related functions to create, delete, change and check existence. In this tutorial we will look how to check a file or directory if it exists. L...

cunjiu9486的博客 1609

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux判断通配符文件存在,在shell脚本中检查文件是否存在通配符

最简单的应该是依靠ls返回值(当文件不存在时它会返回非零值):if ls /path/to/your/files* 1> /dev/null 2>&1; then echo "files do exist" else echo "files do not exist" fi我redirectls输出,使其完全沉默。编辑:由于这个答案已经得到了一些关注(和评论非常有用的批评评论)...

weixin_31983133的博客 2915

Shell判断一个变量是否为空、判断一个文件是否存在

1.判断字符串是否为空 #!/bin/bash myvar="foo" echo $myvar if [ -n "$myvar" ]; then echo "yes" else echo "no" fi 输出: (tf) localhost:offline wang$ sh test.sh foo yes #!/bin/bash myvar="" echo $myvar if [ -n "$myvar" ]; then echo "yes" else echo "no" f

凝眸伏笔的博客 4111

Linux Shell中判断进程是否存在的代码

1 利用pgrep 匹配名字 复制代码 代码如下: if test $( pgrep -f $1 | wc -l ) -eq 0 then echo "进程不存在" else echo "存在进程" fi 以下是补充内容: 当前系统中的进程: apple@ubuntu:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 13:57...

shopju的博客 4345

linux判断参数是否存在,检查bash shell脚本中是否存在输入参数

我需要检查输入参数的存在性。我有下面的剧本if ["$1" -gt"-1" ]then echo hifi我得到[: : integer expression expected如何首先检查输入参数1以查看它是否存在?它是:if [ $# -eq 0 ]thenecho"No arguments supplied"fi$#变量将告诉您脚本传递的输入参数的数量。或者,您可以检查参数是否为空字符串或类似...

weixin_42571476的博客 6991

Linux通过文件名判断此文件是否存在

函数: int stat(const char *path, struct stat *buf); 参数 path 里面放一个文件名 buf 里面存放文件信息 通过把文件名传给stat然后判断此文件是否存在 RETURN VALUE 存在返回0 不存在返回-1 例: #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include &lt.

weixin_52668204的博客 751

bash中判断查找的字符串是否存在

if lsusb | grep "Spreadtrum" > /dev/null 2>&1   then     echo " success" else     echo " fail" fi lsusb | grep "Spreadtrum" > /dev/null 2>&1 if [ "$?" -eq "0" ];then     echo "success" else

kasalyn的专栏 7559

linux用户是否存在_如何测试用户在Linux上是否已经存在?

linux用户是否存在How to test whether a user account, say linuxuser, already exist on Linux? 如何测试Linux上是否已经存在用户帐户(例如linuxuser)? You may make use of id which tries to get user IDs. 您可以利用ID尝试获取用户ID。 The Bash...

cuma2369的博客 4987

linux shell如何判断docker镜像或容器是否存在?

判断某个镜像是否存在 判断某个容器是否存在 参考文章:bash - 如何检查本地是否存在带有特定标签的Docker镜像?

Dontla的博客 1万+

bash如何判断一个文件是否存在

bash如何判断一个文件是否存在 if [ -e $filename ] 空格,注意空格

为了理想而奋斗 4548

Linux Bash脚本检查文件/文件夹是否存在

很多时候,我们写脚本的时候,需要下载文件、根据是否下载到文件后(文件是否存在)来判断下一步的操作。 在Bash里,可以使用test来判断文件/文件夹是否存在,格式如下 test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]] 两个括号会比较常用,不过都可以试试 检查文件是否存在 FILE=/opt/test.txt if [ -f "$FILE" ]; then echo "$FILE exists." fi #if else FILE=/opt

yaoxinghuo的专栏 1万+

linux脚本判断变量存在,shell中关于变量是否存在的问题

[TOC]## fish shell判断某个变量是否存在fish shell 判断变量是否存在直接使用 `test 变量`就可以,然后我们使用`and`和`or`实现if..else..的逻辑。如下所示:```bash#!/usr/bin/env fishset a 1set b 3test $a -gt $b ;and echo "a>b" ;or echo "a<=b"test $...

weixin_31475247的博客 7057

Linux批量更改文件名——Bash/Csh

linux批量更改文件名,包括bash和Csh环境

qq_45964597的博客 6782
上一篇: Bash字符串处理(与Java对照) - 15.计算子串出现的次数
下一篇: Bash字符串处理(与Java对照) - 16.判断是否以另外的字符串开头
codingstandards
博客等级 码龄16年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值