010.cat、find

1、用cat进行拼接

cat命令能够显示或拼接文件内容,不过它的能力远不止如此。比如说,cat能够将标准输入数据与文件数据组合在一起。通常的做法是将stdin重定向到一个文件,然后再合并两个文件。而cat命令一次就能搞定这些操作。

用cat读取文件内容的一般语法是: cat file1 file2 file3 ...该命令将作为命令行参数的文件内容拼接在一起并将结果发送到stdout。

# 打印单个文件的内容
cat file.txt# 打印多个文件的内容
cat one.txt two.txt

cat命令不仅可以读取文件、拼接数据,还能够从标准输入中读取。

管道操作符可以将数据作为cat命令的标准输入:OUTPUT_FROM_SOME COMMANDS | cat

cat也可以将文件内容与终端输入拼接在一起:

echo 'Text through stdin' | cat - file.txt
  • -被作为stdin文本的文件名。
a. 去掉多余的空白行:-s

有时候文本文件中可能包含多处连续的空白行。想删除额外的空白行,可以这样做:cat -s file

  • 另外也可以用tr删除所有的空白行。
b. 将制表符显示为^|:-T

单从视觉上很难将制表符同连续的空格区分开。对于Python而言,制表符和空格是区别对待的。在文本编辑器中,两者看起来差不多,但是解释器将其视为不同的缩进。仅仅在文本编辑器中进行观察是很难发现这种错误的。cat有一个特性,可以将制表符识别出来。这有助于排查缩进错误。

用cat命令的-T选项能够将制表符标记成^I。例如:

cat -T file.py

c. 行号:-n

cat命令的-n选项会在输出的每一行内容之前加上行号。

别担心,cat命令绝不会修改你的文件,它只是根据用户提供的选项在stdout中生成一个修改过的输出而已。可别尝试用重定向来覆盖输入文件。shell在打开输入文件之前会先创建新的输出文件。cat命令不允许使用相同的文件作为输入和重定向后的输出。利用管道并重定向输出会清空输入文件。

2、查找并列出文件

find命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应的操作。默认的操作是打印出文件和目录,这也可以使用-print选项来指定。

a. -print 选项

-print选项使用\n(换行符)分隔输出的每个文件或目录名。而-print0选项则使用空字符'\0'来分隔。-print0的主要用法是将包含换行符或空白字符的文件名传给xargs命令。随后会详细讨论xargs命令:

echo "test" > "file name"
find . -type f -print |  xargs ls -l

find . -type f -print0 | xargs -0 ls -l

b. -name 选项

-name选项指定了待查找文件名的模式。这个模式可以是通配符,也可以是正则表达式。在下面的例子中,'*.txt'能够匹配所有名字以.txt结尾的文件或目录。

注意:*.txt两边的单引号。shell会扩展没有引号或是出现在双引号(")中的通配符。单引号能够阻止shell扩展*.txt,使得该字符串能够原封不动地传给find命令。

find命令有一个选项-iname(忽略字母大小写),该选项的作用和-name类似,只不过在匹配名字时会忽略大小写。

 find . -iname "example*" -print

find命令支持逻辑操作符。-a和-and选项可以执行逻辑与(AND)操作,-o和-or选项可以执行逻辑或(OR)操作。

find . \( -name '*e*' -and -name 's*' \)
# 如果不加 (),查找出来的内容不全
find . \( -name "*.txt" -o -name "*.sh" \) -print
  • 上面的命令会打印出所有的.txt和.sh文件,因为这个find命令能够匹配所有这两类文件。\(以及\)用于将 -name '*.txt' -o -name '*.sh'视为一个整体。

否定参数:find也可以用!排除匹配到的模式

 find . ! -name "*.txt" -print
c. -path 选项

-path选项可以限制所匹配文件的路径及名称。例如,find /home/users -path '*/slynux/*' -name '*.txt' –print能够匹配文件/home/users/slynux/readme.txt,但无法匹配/home/users/slynux.txt。

d. 正则表达式

正则表达式比通配符更复杂,能够更精确地进行模式匹配。使用正则表达式进行文本匹配的一个典型例子就是识别E-mail地址。E-mail地址通常采用name@host.root这种形式,所以可以将其一般化为:

  • [a-z0-9]+@[a-z0-9]+\.[a-z0-9]+。中括号中的字符表示的是一个字符组。在这个例子中,该字符组中包含a-z和0-9。
  • 符号+指明在它之前的字符组中的字符可以出现一次或多次。
  • 点号是一个元字符(就像通配符中的?),因此必须使用反斜线对其转义,这样才能匹配到E-mail地址中实际的点号。
  • 这个正则表达式可以理解为:一系列字母或数字,然后是一个@,接着是一系列字母和数字,再跟上一个点号,最后以一系列字母和数字结尾。
find . -regex '.*\(py\|sh\)$'
  • -iregex选项可以让正则表达式在匹配时忽略大小写。
e. 目录深度

find命令在查找时会遍历完所有的子目录。默认情况下,find命令不会跟随符号链接。-L选项可以强制其改变这种行为。但如果碰上了指向自身的链接,find命令就会陷入死循环中。

-maxdepth和–mindepth选项可以限制find命令遍历的目录深度。这可以避免find命令没完没了地查找。

/proc文件系统中包含了系统与当前执行任务的信息。特定任务的目录层次相当深,其中还有一些绕回到自身

(loop back on themselves)的符号链接。系统中运行的每个进程在proc中都有对应的子目录,其名称就是该进程的进程ID。这个目录下有一个叫作cwd的链接,指向进程的当前工作目录。

 find -L /proc -maxdepth 1 -name 'bundlemaker.def' 2>/dev/null
  • -L选项告诉find命令跟随符号链接
  • 从/proc目录开始查找
  • -maxdepth 1将搜索范围仅限制在当前目录
  • -name 'bundlemaker.def'指定待查找的文件
  • 2>/dev/null将有关循环链接的错误信息发送到空设备
# 印出深度距离当前目录至少两个子目录的所有名字以f开头的文件:
find . -mindepth 2 -name "f*" -print

注意:maxdepth和mindepth应该在find命令中及早出现。如果作为靠后的选项,有可能会影响到find的效率,因为它不得不进行一些不必要的检查。例如,如果-maxdepth出现在-type之后,find首先会找出-type所指定的文件,然后再在匹配的文件中过滤掉不符合指定深度的那些文件。但是如果反过来,在-type之前指定目录深度,那么find就能够在找到所有符合指定深度的文件后,再检查这些文件的类型,这才是最有效的搜索之道。

f. -type 选项

类Unix系统将一切都视为文件。文件具有不同的类型,例如普通文件、目录、字符设备、块设备、符号链接、硬链接、套接字以及FIFO等。

find命令可以使用-type选项对文件搜索进行过滤。借助这个选项,我们可以告诉find命令只匹配指定类型的文件。

g. 时间戳

Unix/Linux文件系统中的每一个文件都有3种时间戳:

  • 访问时间(-atime):用户最近一次访问文件的时间。
  • 修改时间(-mtime):文件内容最后一次被修改的时间。
  • 变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间。

find命令还支持以“分钟”为计时单位的选项:

  • -amin(访问时间)
  • -mmin(修改时间)
  • -cmin(变化时间)

Unix默认并不保存文件的创建时间。但有一些文件系统(ufs2、ext4、zfs、btrfs、jfs)会选择这么做。可以使用stat命令访问文件创建时间。

鉴于有些应用程序通过先创建一个新文件,然后再删除原始文件的方法来修改文件,文件创建时间未必准确。-atime、-mtime和-ctime可作为find的时间选项。它们可以用整数值来指定天数。这些数字前面可以加上-或+。-表示小于,+表示大于。

# 打印出在最近7天内被访问过的所有文件
find . -type f -atime -7 -print# 打印出恰好在7天前被访问过的所有文件
find . -type f -atime 7 -print# 打印出访问时间超过7天的所有文件
find . -type f -atime +7 -print

–newer选项可以指定一个用于比较修改时间的参考文件,然后找出比参考文件更新的(更近的修改时间)所有文件。

# 找出比file.txt修改时间更近的所有文件
find . -type f -newer file.txt -print
h. 文件大小

可以根据文件的大小展开搜索:

# 大于2KB的文件
find . -type f -size +2k# 小于2KB的文件
find . -type f -size -2k# 大小等于2KB的文件
find . -type f -size 2k

b

块(512字节)

c

字节

w

字(2字节)

k

千字节(1024字节)

M

兆字节(1024K字节)

G

吉字节(1024M字节)

i. 文件权限

-perm选项指明find应该只匹配具有特定权限值的文件。

# 打印出权限为644的文件
find . -type f -perm 644 -printfind . -type f -name "*.php" ! -perm 644 –print

也可以根据文件的所有权进行搜索。用选项 -user USER就能够找出由某个特定用户所拥有的文件。

# 打印出用户slynux拥有的所有文件
find . -type f -user slynux -print
j. 删除匹配的文件

find命令的-delete选项可以删除所匹配到的文件。

# 下面的命令能够从当前目录中删除.swp文件
find . -type f -name "*.swp" -delete
k. 执行命令

利用-exec选项,find命令可以结合其他命令使用。

# 找到了root所拥有的两个文件,那么它会将其所有者改为slynux
find . -type f -user root -exec chown slynux {} \;
  • 注意:该命令结尾的\;。必须对分号进行转义,否则shell会将其视为find命令的结束,而非chown命令的结束。

为每个匹配到的文件调用命令可是个不小的开销。如果指定的命令接受多个参数(如chown),你可以换用加号(+)作为命令的结尾。这样find会生成一份包含所有搜索结果的列表,然后将其作为指定命令的参数,一次性执行。

# 将给定目录中的所有C程序文件拼接起来写入单个文件all_c_files.txt。各种实现方法如下:
find . -type f -name '*.c' -exec cat {} \;>all_c_files.txt
find . -type f -name '*.c' -exec cat {} > all_c_files.txt \;
find . -type f -name '*.c' -exec cat {} >all_c_files.txt +# 以将10天前的 .txt文件复制到OLD目录中
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD  \;

无法在exec选项中直接使用多个命令。该选项只能够接受单个命令,不过我们可以耍一个小花招。把多个命令写到一个shell脚本中(例如command.sh),然后在-exec中使用这个脚本:-exec ./commands.sh {} \;

-exec可以同printf搭配使用来生成输出信息:

find . -type f -name "*.txt" -exec printf "Text file: %s\n" {} \;
l. -prune 选项

在find的执行过程中,跳过某些子目录能够提升性能。例如,在版本控制系统(如Git)管理的开发源代码树中查找特定文件时,文件系统的每个子目录里都会包含一个目录,该目录中保存了和版本控制相关的信息。这些目录通常跟我们没什么关系,所以没必要去搜索它们。

在搜索时排除某些文件或目录的技巧叫作修剪。下面的例子演示了如何使用-prune选项排除某些符合条件的文件:

 find devel/source_path -name '.git' -prune -o -type f -print
  • -name ".git" –prune是命令中负责进行修剪的部分,它指明了.git目录应该被排除在外。
  • -type f –print描述了要执行的操作。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java排序算法之希尔排序

希尔排序(Shell Sort)又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。它的基本思想是:首先将整个数组按照一定的间隔分成若干个子序列,然后对每个子序列分别进行插入排序,减小间隔&#…

2023双十一爆冷收场,订单后暗藏这些电商痛点问题需要注意

打开某软件的瞬间,手不小心抖一下就进入了淘宝,而且无法第一时间准确找到关闭按钮。相信不少人都在这个双十一通过开屏广告为淘宝“贡献”至“超8亿”的访问量,更有网友辣评:“现在打开别的软件跳转淘宝的速度都比直接打开淘宝要快…

大语言模型量化方法对比:GPTQ、GGUF、AWQ

在过去的一年里,大型语言模型(llm)有了飞速的发展,在本文中,我们将探讨几种(量化)的方式,除此以外,还会介绍分片及不同的保存和压缩策略。 说明:每次加载LLM示例后,建议清除缓存,以…

【LIUNX】配置缓存DNS服务

配置缓存DNS服务 A.安装bind bind-utils1.尝试修改named.conf配置文件2.测试nslookup B.修改named.conf配置文件1.配置文件2.再次测试 缓存DNS服务器:只提供域名解析结果的缓存功能,目的在于提高数据查询速度和效率,但是没有自己控制的区域地…

虹科方案 | 从概念到生产的自动驾驶软件在环(SiL)测试解决方案

来源:雅名特自动驾驶 虹科方案 | 从概念到生产的自动驾驶软件在环(SiL)测试解决方案 自动驾驶软件在环(SiL)测试解决方案 自动驾驶软件在环(SiL)测试解决方案能够研究和验证高历程实验和恶劣驾…

计算属性与watch的区别,fetch与axios在vue中的异步请求,单文本组件使用,使用vite创建vue项目,组件的使用方法

7.计算属性 7-1计算属性-有缓存 模板中的表达式虽然很方便,但是只能做简单的逻辑操作,如果在模版中写太多的js逻辑,会使得模板过于臃肿,不利于维护,因此我们推荐使用计算属性来解决复杂的逻辑 <!DOCTYPE html> <html lang"en"> <head><meta …

初试 jmeter做压力测试

一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试&#xff0c;他可以帮助我们发现系统中的瓶颈问题&#xff0c;减少发布到生产环境后出问题的几率&#xff1b;预估系统的承载能力&#xff0c;使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步…

BMS系统项目

1、通过电压监测是否冲满&#xff0c;通过电压可以监测是否放完电 电池得参数 单体过压&#xff08;充满电&#xff09; 过压恢复&#xff08;百分之90多&#xff09; 欠压保护&#xff08;百分之几得电&#xff0c;快关机了&#xff09; 欠压恢复&#xff08;就是欠压之上…

【博客系统】 一

该博客系统基于servlet和mysql数据库 , 并且通过xshell终端工具部署至云服务器. 实现的功能包括: 1.博客列表页 2.博客详情页 3.登陆页面 4.强制登陆检查 5.获取用户信息 6.退出登陆 7.发布博客 一.系统展示 登陆页面 博客列表页 博客详情页 博客编辑页 下面就开始编写代码了.…

【Java 进阶篇】JQuery 案例:下拉列表选中条目左右移动,打破选择的边界

在前端的舞台上&#xff0c;下拉列表是常见的用户交互元素&#xff0c;但有时候我们想要更多的交互体验。通过巧妙运用 JQuery&#xff0c;我们可以实现下拉列表中选中条目的左右移动功能&#xff0c;为用户提供更加灵活的选择方式。本篇博客将深入研究 JQuery 中实现这一功能的…

基于安卓android微信小程序的师生答疑交流平app

项目介绍 本课题研究的是基于HBuilder X系统平台的师生答疑交流APP&#xff0c;开发这款师生答疑交流APP主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了师生答疑交流APP的界面设计及使用&#xff0c;主要包括界面的实现、控件的使用、界面的布局和异常…

C语言从入门到精通之【基本运算符】

赋值运算符 在C语言中&#xff0c;并不意味着“相等”&#xff0c;而是一个赋值运算符。下面的赋值表达式语句&#xff1a; bmw 2002; 把值2002赋给变量bmw。也就是说&#xff0c;号左侧是一个变量名&#xff0c;右侧是赋给该变量的值。符号被称为赋值运算符。另外&#xff0…

【数电】IEEE754浮点数

IEEE754浮点数 1.组成及分类2.计算(1)符号位(2)阶码(3)尾码(4)实际计算公式 1.组成及分类 &#xff08;1&#xff09;组成 IEEE754浮点数由三部分组成&#xff1a;符号位、阶码和尾码。 &#xff08;2&#xff09;分类 根据数据位宽分为三类&#xff1a;短浮点数、长浮点数和…

54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,…

【Android】配置Gradle打包apk的环境

目录 生成jks签名文件 配置build.gradle&#xff08;app&#xff09; 打包 生成jks签名文件 Java 密钥库&#xff08;.jks 或 .keystore&#xff09;是用作证书和私钥存储库的二进制文件。用于为用户设备上安装的 APK 签名的密钥。 详细解释请看官方文档&#xff1a; 为应用…

Zookeeper Java SDK 开发入门

文章目录 一、概述二、导入依赖包三、与 Zookeeper 建立连接四、判断 ZooKeeper 节点是否存在四、创建 ZooKeeper 节点数据五、获取 ZooKeeper 节点数据六、修改 ZooKeeper 节点数据七、异步获取 ZooKeeper 节点数据八、完整示例 如果您还没有安装Zookeeper请看ZooKeeper 安装说…

如何调整图片尺寸:简单实用的教程分享

报名事业编考试的时候&#xff0c;会发现上传照片时会提示图片大小尺寸应该为多少&#xff0c;如果不符合规定就无法提交报名&#xff0c;那么怎么才能修改图片大小呢&#xff1f;最简单的方法就是利用调整照片大小工具来对图片尺寸修改&#xff0c;本文分享一个在线图片处理工…

【软考篇】中级软件设计师 第四部分(一)

中级软件设计师 第四部分&#xff08;一&#xff09; 二十九. 程序设计语言概述29.1 解释、编译29.3 编译程序29.4 后缀式29.5 文法定义29.6 正规式29.7 有限自动机29.8 语法分析方法 三十. 法律法规30.1 作品所属权30.2 商标有效期30.3 职务作品所属权30.4 单位与委托30.5 商标…

【开源】基于Vue.js的校园二手交易系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模块2.3 商品预约管理模块2.4 商品预定管理模块2.5 商品留言板管理模块2.6 商品资讯管理模块 三、实体类设计3.1 用户表3.2 二手商品表3.3 商品预约表3.4 商品预定表3.5 留言表3.6…

SharePoint-连接Excel

Power Automate和Power Apps想要连接Excel表格的话&#xff0c;可以在OneDrive或SharePoint网站的文档中创建Excel文件&#xff0c;然后把Excel转换成table表格 以SharePoint为例&#xff0c;在文档中点击新建&#xff0c;选择Excel工作簿 填写内容&#xff0c;然后全选选中 在…