文件查找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
执行动作:
命令 | 含义 |
---|---|
打印到屏幕 | |
-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从入门到精通”--------------------------------------------