shell学习笔记---文件查找比较及重定向

文件查找find命令:
格式:find 搜索路径 筛选条件 执行动作
下面命令是在当前目录中找出名字以shell开头的文件并打印。.是搜索路径,表示当前目录;-name "shell*"是筛选条件,表示根据名字查找,shell开头;-print是执行动作,表示打印(可省略,不加任何执行动作默认就是打印结果)。注意筛选条件可以是多个。

find . -name "shell*" -print

工作流程:根据指定的路径查找符合筛选条件的文件,添加到结果列表中,然后对于结果列表中的每一个文件执行指定动作
常用路径:

路径含义
/usr/bin指定某一个决定路径
/根目录
.当前目录

筛选条件:

筛选条件含义
-name pattern筛选名字符合匹配模式的文件,匹配模式可以是具体的文件名。也可以是含有通配符的模糊搜索。?表示匹配任意一个单个字符;*表示0个或多个任意字符;[]表示其中任意一个字符
-iname pattern同上,但是不区分大小写
-type f/d/p/l筛选指定文件类型,-f表示普通文件,-d表示目录
-user userid筛选指定所有者为指定用户id的文件
-group groupid筛选所有者的主组为指定组id的文件
-size size筛选大小为指定大小的文件
-empty筛选空文件
-amin [-+]n筛选文件最后一次访问时间符合的文件。-n表示访问时间为距现在n分钟之内,+n表示距现在n分钟之外,n则表示正好n分钟
-atime [-+]n筛选文件最后一次访问时间符合的文件。-n表示访问时间为距现在n天之内,+n表示距现在n天之外,n则表示正好n天
-cmin [-+]n筛选文件最后一次状态改变(权限属性等)时间符合的文件。-n表示访问时间为距现在n分钟之内,+n表示距现在n分钟之外,n则表示正好n分钟
-ctime [-+]n筛选文件最后一次状态改变(权限属性等)时间符合的文件。-n表示访问时间为距现在n天之内,+n表示距现在n天之外,n则表示正好n天
-mmin [-+]n筛选文件内容最后一次修改时间符合的文件。-n表示访问时间为距现在n分钟之内,+n表示距现在n分钟之外,n则表示正好n分钟
-mtime [-+]n筛选文件内容左后一次修改时间符合的文件。-n表示访问时间为距现在n天之内,+n表示距现在n天之外,n则表示正好n天

取反:可以通过!号对筛选条件取反,找到不符合筛选条件的文件。
下面命令是找到最后一次内容修改时间不在10天之内的文件并打印

find . \! -ctime -10 -print#注意!写在筛选条件前面,用空格隔开;并且要加反斜线或单引号

在执行搜索命令时,可能会因为权限不足打印一些错误。可以通过重定向直接将这个错误丢弃

find / -type d -name "test" -print 2> /dev/null 

执行动作:

命令含义
-print打印到屏幕
-fprint file打印到文件中
-ls详细的在屏幕中显示
-fls file详细的写入文件
-delete删除
-exec command {} ;执行指定的命令,{}表示搜索的文件名 。注意大括号后面的空格反斜线以及分号
-ok command {} ;执行指定的命令,但是需要用户确认。注意大括号后面的空格反斜线以及分号
find . -name "test4.txt" -ok rm -rf {} \;

结果:查找当前目录下名为test4.txt的文件并执行删除命令,可以看到有提示和用户确认
在这里插入图片描述

比较文件comm和diff命令:
comm命令:
格式:comm 参数 文件1 文件2 。 需要注意的是需要两个比较文件已经是有序的

comm test1.txt test2.txt

结果:一共显示三列,第一列为第一个文件独有的,第二列为第二个文件独有的,第三列为两个文件共有的
在这里插入图片描述

参数含义
-1不显示第一个文件独有的文本行
-2不显示第二个文件独有的文本行
-3不显示两个文件共同的文本行
--check-order检查两个文件是否已经排序
--nocheak-order不检查两个文件是否已经排序

diff命令:
格式:diff 参数 文件1 文件2

diff test1.txt test2.txt

结果:2c2表示第一个文件中的第二行被修改了,对应的是第二个文件中的第二行,具体两个文件中的第二行内容在下面显示,<代表第一个文件,>代表第二个文件;5a6表示第二个文件在第一个文件的第五行增加了一行,对应的第二个文件的第六行,具体增加内容如下面显示;7d7表示第一个文件的第七行在第一个文件中被删除了,删除内容如下面显示。总结一下,a 、d和c分别代表增加删除和修改
在这里插入图片描述
参数-c :

diff -c test1.txt test2.txt

结果:前两行分别显示两个文件的最后修改时间。星号对应的第一个文件的内容,从第一行到第七行内容;短横线对应的是第二个文件的内容,也是从第一行对应第七行;分别打印出部分内容,叹号表示两个文件该行内容不相同;加号表示该行是在第二个文件中增加的;减号表示该行在第二个文件中被删除了
在这里插入图片描述
参数-u:

diff -u test1.txt test2.txt

结果:前两行分别显示两个文件的最后修改时间。@@之间的分别是下面内容对应在两个文件中的位置,均是第一行到第七行;加号表示该行是在第二个文件中增加的;减号表示该行在第二个文件中被删除了
在这里插入图片描述
参数-y:

diff -y test1.txt test2.txt

结果:左右两侧分别显示出两个文件的内容。|代表被修改,>代表是第二个文件中增加的,<代表是第二个文件被删除的
在这里插入图片描述
重定向:
输出重定向:> 和 >> 和 >& 和 &>

符号含义
ls > test.log将结果保存到test.log中,如果test.log已经有内容,则覆盖
ls >> test.log结果保存到test.log中,如果test.log已经有内容,则追加
ls 1> test.log将标准输出结果保存到文件中,1代表标准输出,可省略
ls 2> test.log将标准错误输出保存到文件中,2代表标准错误输出,不可省略
ls 2>& 1将标准错误输出输出到标准输出中,>后面的&代表输出到其他输出中,而不是文件中;注意>&中不能有空格
ls &> test.log将标准输出和标准正确输出都保存到文件中,等同ls >& test.log和ls 1>test.log 2>& 1;注意>&中不能有空格

多个命令一起重定向:用大括号将多个命令括起来,前后各有空格,每个命令用分号隔开,包括最后一个命令。

{ ls; date; } > test_chongdingxiang.txt

输入重定向:<和<<

符号含义
0< test.log从test.log中读取数据,0表示标准输入,可省略

<<表示当前文档。eof表示分隔符,两个eof之间的都是输入重定向的内容
在这里插入图片描述
exec命令分配文件描述符:上面的重定向都是针对于一行命令。可以使用exec重定向整个系统标准输入输出等。
上面提到的0、1和2都是文件描述符,分别代表标准输入,标准输出以及错误输出。都是文件描述符不止这些,每个数字都可以代表一个文件描述符(有限制),例如3、57、88、93等等,每一个文件描述符代表一个文件。

命令含义
exec n< file用文件描述符以只读的方式打开file,n是大于2的整数,即文件描述符
exec n> file用文件描述符以写入的方式打开file,n是大于2的整数,即文件描述符
exec n<> file用文件描述符以读写的方式打开file,n是大于2的整数,即文件描述符
exec n>&-关闭文件描述符n
exec n>&m将文件描述符重定向到m,即上文的2>& 1

小荔枝1:先定一个中间文件描述符99用于备份标准错误输出的位置,然后将标准错误输出重定向某一个文件,输入错误命令,最后还原标准错误输出到原来位置并删除中间文件描述符

exec 99>&2 #将文件描述99重定向标注错误输出,用于备份标准错误输出
exec 2> test_chongdingxiang.txt #将标准错误输出重定向文件
lsl -l #错误命令
exec 2>&99 #将标准错误输出重定向到文件符99,即原来的地方
exec 99>&- #关闭文件描述符99

小荔枝2:

exec 88< <(ls -l) #将命令输出内容重定向到空管道,再将文件描述符88以度的方式打开,即读取其中数据
n=1

while read line;#read 读取内容
do
    echo "LINE${n}:${line}"
    n=$((${n}+1))
done <&88 #从文件描述中88读取输入
exec 88>&- #关闭文件描述符88

-------------------------------学习自“shell从入门到精通”--------------------------------------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值