shell脚本的条件判断2:文件属性的判断与比较

news2025/7/16 16:06:10

一 文件属性的判断与比较

Shell支持大量对文件属性的判断,常用的文件属性操作符很多,如下表所示。更多文件属性操作符可以参考命令帮助手册(man test)。

二 实例 

实例:文件和目录判断 

 可以创建新的文件,也可以使用已有的文件进行测试。

 判断文件是否存在:

root@ubuntu:/home/csdn# [ -e main.c ] && echo Y || echo N
Y
root@ubuntu:/home/csdn# [ -e nofile.c ] && echo Y || echo N
N
root@ubuntu:/home/csdn# [ ! -e nofile.c ] && echo Y || echo N
Y
root@ubuntu:/home/csdn# [ ! -e main.c ] && echo Y || echo N
N
root@ubuntu:/home/csdn#

目录判断:hello是一个目录


root@ubuntu:/home/csdn# [ -e hello ] && echo Y || echo N
Y
root@ubuntu:/home/csdn# [ -f hello ] && echo Y || echo N
N
root@ubuntu:/home/csdn# [ -d hello ] && echo Y || echo N
Y
root@ubuntu:/home/csdn#

实例:块设备测试 

下面这个测试,假设系统中有某个磁盘设备,使用-b测试该设备是否存在,且当该设备为块设备时返回值为Y,否则返回值为N。

root@host:~# [ -b /dev/mmcblk1p2 ] && echo Y || echo N
Y
root@host:~# [ -b /dev/mmcblk1p1 ] && echo Y || echo N
Y
root@host:~# [ -b /dev/mmcblk1p3 ] && echo Y || echo N
N
root@host:~#

实例:软/硬链接判断 

 Linux系统中的文件链接分为软链接和硬链接两种。软链接创建后,如果源文件被删除,则软链接将无法继续使用,可以跨分区和磁盘创建软链接。硬链接创建后,如果源文件被删除,则硬链接依然可以正常使用、正常读写数据,但硬链接不可以跨分区或磁盘创建。另外,硬链接与源文件使用的是相同的设备、相同的inode编号。使用ls -l(小写字母L)命令查看硬链接文件的属性时,文件属性与普通文件是一样的,而软链接的文件属性则可以看到被l(小写字母L)标记,表示该文件为软链接。

虽然文件main.c不存在,但是依然可以创建一个指向它的软链接 

root@host:~# ln -s main.c softlink.c
root@host:~# ls -l main.c softlink.c
ls: main.c: No such file or directory
lrwxrwxrwx    1 root     root             6 Jan  1 05:55 softlink.c -> main.c
root@host:~#

 此时指向的main.c是红色的

 使用touch创建了一个main.c,链接颜色正常了

判断软链接: 

root@host:~# [ -L softlink.c ] && echo Y || echo N
Y
root@host:~#

硬链接判断:

root@host:~# ln main.c hard.c
root@host:~# [ -f hard.c  ] && echo Y || echo N
Y
root@host:~# [ -L hard.c  ] && echo Y || echo N
N
root@host:~#

在测试权限时需要注意,超级管理员root在没有rw权限的情况下,也是可以读写文件的,rw权限对超级管理员是无效的。但是如果文件没有x权限,哪怕是root也不可以执行该文件。

root@host:~# ls -l main.c
-rw-rw-rw-    2 root     root             0 Jan  1 05:58 main.c
root@host:~# chmod -rw main.c
root@host:~# ls -ls main.c
     1 ----------    2 root     root             6 Jan  1 06:06 main.c
root@host:~# echo "hello" > main.c
root@host:~# cat main.c
hello
root@host:~# ./main.c
-sh: ./main.c: Permission denied
root@host:~#

为了获得相对可参考的值,切换用户为普通用户:

 测试之前,文件main.c可读可写,通过chmod -rw后,文件不可读,不可写。

csdn@ubuntu:~$ ls -ls main.c
4 -rw-rw-r-- 1 csdn csdn 93 11月 26 11:04 main.c
csdn@ubuntu:~$ [ -r main.c ] && echo Y || echo N
Y
csdn@ubuntu:~$ [ -w main.c ] && echo Y || echo N
Y
csdn@ubuntu:~$ [ -x main.c ] && echo Y || echo N
N
csdn@ubuntu:~$ chmod -rw main.c
csdn@ubuntu:~$ [ -r main.c ] && echo Y || echo N
N
csdn@ubuntu:~$ [ -w main.c ] && echo Y || echo N
N
csdn@ubuntu:~$ [ -x main.c ] && echo Y || echo N
N
csdn@ubuntu:~$

实例:判断文件非空 

 默认touch命令创建的文件都是空文件,在使用-s测试文件是否为非空文件时,因为文件是空文件,所以测试结果为假。当文件中有内容时,测试文件是否为非空时,结果为真。

root@host:~# [ -s newfile ] && echo Y || echo N
N
root@host:~# echo "hehe" > newfile
root@host:~# ls -ls newfile
     1 -rw-rw-rw-    1 root     root             5 Jan  1 06:09 newfile
root@host:~# [ -s newfile ] && echo Y || echo N
Y
root@host:~#

实例:对比文件时间 

现在可以使用测试条件判断两个文件的创建时间,看看哪个文件是新文件,哪个文件是旧文件。new than表示更新,old than表示更旧。根据下面的输出结果可知,main.c文件比other.c文件更旧。 

首先,看下两个文件的信息: 

csdn@ubuntu:~$ ls main.c other.c -ls
4 ---------- 1 csdn csdn 93 11月 26 11:04 main.c
4 -rw-rw-r-- 1 csdn csdn 89 11月 26 11:10 other.c
csdn@ubuntu:~$

 文件main.c比other.c更旧

csdn@ubuntu:~$ [ main.c -nt other.c ] && echo Y || echo N
N
csdn@ubuntu:~$ [ main.c -ot other.c ] && echo Y || echo N
Y
csdn@ubuntu:~$

文件main.c自己和自己比呢?既不新也不旧。

csdn@ubuntu:~$ [ main.c -ot main.c ] && echo Y || echo N
N
csdn@ubuntu:~$ [ main.c -nt main.c ] && echo Y || echo N
N
csdn@ubuntu:~$

 小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

属性值最大长度为30个字符(15个汉字)

上图是一位做成人用品店主反馈的问题,查看发过来的错误列表后,发现这份错误列表主要是有两个问题:一、属性值最大长度为30个字符(15个汉字);二、手机端宝贝描述中每张图片的宽要在480到1500之间,最大高度为2500, 以下图…

深度学习之路=====11=====>>ShuffleNet(tensorflow2)

简介 来源:CVPR2017 作者:张祥雨,西安交通大学本硕博,原微软亚洲研究院研究员 特点 逐点分组卷积(pointwise group conv):使用了kernel_size1的分组卷积,大大降低模型参数量和计算量深度卷积…

阅读书《电子电路原理》截取的一些最核心的思想,找了个课程上海交通大学 郑益慧主讲做辅助(保证基本的理解是对的)。电路要以基本特性为基础从设计角度理解

一、戴维南 和 诺顿 物理量 过程戴维南等效诺顿等效步骤 l将负载电阻开路将负载电阻短路步骤 2计算或测量开路电 压, 即戴维南电压计算或测量短路电流,即诺顿电流步骤 3将电压源短路,电流源开路将电压源短路,电流源开路&#xff…

学生网页课程设计期末作业 HTML+CSS+JavaScript甜品蛋糕网页设计(5页)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

如何使用 Nginx 部署 React App 到 linux server

油鹳视频:How To Deploy A React App - Using NGINX & Linux https://www.youtube.com/watch?vKFwFDZpEzXY&t547s 1. 获得一个 linux server 方法很多种,例如 aws EC2 , 阿里云 ECS , linode 等 2. 登录远程服务器并设置服务器 命…

二十八、CANdelaStudio实践-10服务(SessionControl)

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍10服务(DiagnosticSessionControl)的查看与编辑,欢迎…

看我如何连夜自建网站背刺我的求职对手们

摘要:在竞争如此激烈的当下,作为一名IT新人,怎么才能让HR眼前一亮,从万千简历中脱颖而出成为最亮的那个崽呢?本文分享自华为云社区《【一行代码秒上云】连夜自建网站背刺我的求职对手们 !》,作者…

红队隧道加密之OpenSSL加密反弹Shell(一)

前言 在红队的后渗透阶段中, 往往需要反弹shell进行下一步的内网横向渗透, 而这种反弹shell大多数都有一个缺点, 那就是其传输的流量都是明文传输, 相当容易被内网的防火软件所捕捉, 要是蓝队对此流量进行朔源分析, 很容易就能复现攻击的整个流程 例如此处用netcat反弹Shell进…

十、CANdelaStudio入门-States

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的States概念,欢迎各位朋友订阅、评论,可…

AcWing245. 你能回答这些问题吗 线段树详解

3.2线段树 例题分析 245. 你能回答这些问题吗 - AcWing题库 **题意:**给一条序列,如何动态维护区间的最大子段和,包括询问某区间的最大字段和和修改某个数。 分析:线段树struct保留什么信息。能否通过左右儿子的这些信息求出父…

HA RabbitMQ on K8s helm部署实战

RabbitMQ on K8s helm部署实战获取helm chart修改必要参数外部如何访问?安装rabbitmq登录管理界面导入mq metadata优化helm chart 生成的statefuleset yamlhelm chart 生成的pod yaml调整mq log等级promethrus 监控mq配置prometheus采集metrics查看prometheus rabbi…

零基础借助arpl自动编译工具在一小时之内将旧笔记本、嵌入式设备等改造成黑群辉

文章目录1. 前言2. 编译2.1. 到GitHub把编译引导需要用的img文件下载到电脑上2.2. 将下载下来的IMG文件解压为img文件,用rufus或者其他写盘工具写入到U盘中,2.3. 进行引导启动2.4. 获得编译系统的IP地址2.5. 在同一局域网下,打开这个IP地址2.…

Java学习笔记 --- IO流

一、文件 什么是文件 文件是保存数据的地方 文件流 文件在程序中是以流的形式来操作的 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序&a…

Pr:文本面板之转录文本

Pr菜单:窗口/文本Text在文本面板的转录文本 Transcript选项卡中,单击“转录序列” Transcribe sequence按钮,然后设置好选项并进行语音到文本的转录。创建转录文本对话框Create transcript语言Language选择视频中语音所使用的语言。也可选择不…

2.7 基本放大电路的派生电路

在实际应用中,为了进一步改善放大电路的性能,可用多只晶体管构成复合管来取代基本电路中的一只晶体管;也可根据需要将两种基本接法组合起来,以得到多方面性能俱佳的放大电路。 一、复合管放大电路 1、复合管 (1&…

【路径规划】(1) Dijkstra 算法求解最短路,附python完整代码

好久不见,我又回来了,这段时间把路径规划的一系列算法整理一下,感兴趣的点个关注。今天介绍一下机器人路径规划算法中最基础的 Dijkstra 算法,文末有 python 完整代码,那我们开始吧。 1. 算法介绍 1959 年&#xff0c…

Bugku MISC 啊哒 贝斯手

啊哒 下载文件,解压后发现是一张图片,用010editor打开 可以看到里面有个flag.txt 。使用kali中的binwalk进行文件分离 查看文件 : binwalk ada.jpg 分离文件 : binwalk -e ada.jpg --run-asroot 打开分离后的文件夹 可以看到有一…

T288401 B-莲子的机械动力学

专攻超统一物理学的莲子,对机械结构的运动颇有了解。如下图所示,是一个三进制加法计算器的(超简化)示意图。 一个四位的三进制整数,从低到高位,标为 x_1,x_2,x_3,x_4x1​,x2​,x3​,x4​。换言之&#xff0…

第八章《Java高级语法》第12节:Lambda表达式

Lambda 表达式是 JDK8 的一个新特性,它可以定义大部分的匿名内部类,从而让程序员能写出更优雅的Java代码,尤其在集合的各种操作中可以极大地优化代码结构。 8.12.1 认识Lambda表达式 一个接口的实现类可以被定义为匿名类。经过大量实践,人们发现定义一个接口的匿名实现类…

ADAU1860调试心得(8)FASTDSP-0 通道输入

这个程序,我们正式要用到 DSP 了,ADC 进来的数据,经过 FASTDSP 的算法进行处理,再 送给 DAC 推到耳机,通道我们输入 0 到输出为例,还是先做直通,DSP 路过一下,并不做处理。 首先是寄…