find
- 查找命令,可以根据类型查找文件
- 用法:
find
[选项] [查找路径] [查找标准] [查找到以后的处理动作]- 选项:
-name filename
对文件名精确匹配,支持通配符-iname filename
文件名匹配时不区分大小写-user
查找某用户的所有文件-group
查找某组的所有文件-uid
根据UID进行查找-gid
根据GID进行查找-nouser
查找没有拥有者的文件-nogroup
查找没有属组的文件-type
根据文件类型进行查找-size
根据文件大小进行查找。如1M、+10k、-10M- +表示大于,-表示小于,不加的表示等于
-mtime
根据修改时间查找+5
表示查找5天以前修改的文件-5
表示查找5天以内修改的文件-atime
根据访问时间查找-ctime
根据改变时间查找-perm mode
根据权限精确查找-perm –mode
文件权限能完全包含此mode时才符合条件-perm /mode
9位权限中有任何一位权限匹配都视为符合查找条件-print
打印到屏幕上-ls
类似ls –l的形式显示每一个文件的详细信息-delete
删除查找到的文件-fls /path/to/somefile
将查找到的所有文件的长格式信息保存至指定文件中-ok COMMAND {} ;
对查找到的所有文件执行某一个命令,每次操作都需要用户确认-exec COMMAND {} ;
对查找到的所有文件执行某一个命令,操作不需要确认-regex pattern
基于正则表达式进行文件名匹配
- 选项:
[root@bad test]# find -name bad //在当前目录下查找bad
./bad
[root@bad test]# find /etc/ -name passwd //在/etc/目录下查找passwd
/etc/passwd
/etc/pam.d/passwd
[root@bad test]# find -iname a /忽略大小写在当前目录下查找a
./a
./A
[root@bad test]# find /home/ -user jay | head -3 //在/home目录下查找属于用户jay的文件,仅查看前三行
/home/jay
/home/jay/.mozilla
/home/jay/.mozilla/extensions
[root@bad test]# find /home/ -nouser -exec rm -rf {} ; //查找/home/目录下没有属主的文件,并且删除
[root@bad test]# find /home/ -uid 1000 //在/home/目录下查找uid为1000的文件
[root@bad test]# find /root/test/ -type f //查找的类型是文件
/root/test/5
/root/test/6
/root/test/7
/root/test/8
[root@bad test]# find /root/test/ -type d //查找的类型是目录
/root/test/
/root/test/1
/root/test/2
/root/test/3
/root/test/4
[root@bad test]# find -size +1k //在当前目录下查找大于1k的文件
.
./anaconda-ks.cfg
./passwd
[root@bad test]# find -size -1k //在当前目录下查找小于1k的文件
./5
./6
./7
[root@bad test]# find -mmin -5 //在当前目录下查找5分钟以内创建的文件
[root@bad test]# find -mmin +10 //在当前目录下查找10分钟以前创建的文件
[root@bad test]# ll
total 12
drwxr-xr-x. 2 root root 6 Nov 3 00:04 1
drwxr-xr-x. 2 root root 6 Nov 3 00:04 2
drwxr-xr-x. 2 root root 6 Nov 3 00:04 3
drwxr-xr-x. 2 root root 6 Nov 3 00:04 4
-rw-r--r--. 1 root root 0 Nov 3 00:10 5
-rw-r--r--. 1 root root 0 Nov 3 00:10 6
-rw-r--r--. 1 root root 0 Nov 3 00:10 7
-rw-------. 1 root root 1196 Nov 3 00:08 anaconda-ks.cfg
-rw-r--r--. 1 root root 293 Nov 3 00:08 ifcfg-eno16777736
-rw-r--r--. 1 root root 1905 Nov 3 00:08 passwd
[root@bad test]# find -perm 644 //在当前目录下查找权限为644的文件
./passwd
./ifcfg-eno16777736
./5
./6
./7
[root@bad test]# find -perm 644 -type f //在当前目录下查找权限为644且类型为文件
[root@bad test]# find -type f -perm 644 -ls //在当前目录下查找权限为644的文件并列出
71511020 4 -rw-r--r-- 1 root root 1905 Nov 3 00:08 ./passwd
71511021 4 -rw-r--r-- 1 root root 293 Nov 3 00:08 ./ifcfg-eno16777736
71511012 0 -rw-r--r-- 1 root root 0 Nov 3 00:10 ./5
71511015 0 -rw-r--r-- 1 root root 0 Nov 3 00:10 ./6
71511016 0 -rw-r--r-- 1 root root 0 Nov 3 00:10 ./7
[root@bad test]# find -type f -perm 644 -delete //在当前目录下查找权限为644的文件并删除
[root@bad test]# ls
1 2 3 4 anaconda-ks.cfg
[root@bad test]# find -type d -ok rm -rf {} ; //在当前目录下查找类型为目录的文件,并删除,提示用户确认
< rm ... . > ? y
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
< rm ... ./1 > ? y
find: ‘./1’: No such file or directory
< rm ... ./2 > ? y
find: ‘./2’: No such file or directory
< rm ... ./3 > ? y
find: ‘./3’: No such file or directory
< rm ... ./4 > ? y
find: ‘./4’: No such file or directory
[root@bad test]# ls
anaconda-ks.cfg
[root@bad test]# ls
1 2 3 4 anaconda-ks.cfg
[root@bad test]# find -type d -exec rm -rf {} ; //在当前目录下查找类型为目录的文件,并删除,不提示用户确认
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
find: ‘./1’: No such file or directory
find: ‘./2’: No such file or directory
find: ‘./3’: No such file or directory
find: ‘./4’: No such file or directory
[root@bad test]# ls
anaconda-ks.cfg
[root@bad test]# find -type f | xargs rm -rf //在当前目录下查找类型为普通文件,并删除;不能用于文件过多的删除
在使用ls
命令时,我们所看到的详细信息中,第一个字符就代表着文件类型,-
表示的是文件。
f
普通文件d
目录s
套接字l
链接文件b
块设备c
字符设备
grep
- 过滤
- 用法:
grep
[选项]- 选项:
-i
忽略大小写-v
显示没有被正则表达式匹配到的内容-o
只显示被正则表达式匹配到的内容-E
使用扩展正则表达式-q
静默模式,不输出任何信息-A #
此处的#必须是数字。被正则匹配到的内容以及其后面#行的内容都显示出来-B #
此处的#必须是数字。被正则匹配到的内容以及其前面#行的内容都显示出来-C #
此处的#必须是数字。被正则匹配到的内容及其前后各#行的内容都显示出来
[root@bad test]# ls
abc Abc ABC passwd bad
[root@bad test]# ls | grep abc
abc
[root@bad test]# ls | grep Abc
Abc
[root@bad test]# ls | grep '[aA]bc'
abc
Abc
[root@bad test]# ls | grep 'abc'
abc
[root@bad test]# ls | grep -i 'abc' //过滤忽略大小写的abc
abc
Abc
ABC
[root@bad test]# ls | grep '^abc$'
abc
[root@bad test]# ls | grep -E '(a|A)bc'
abc
Abc
abcd
[root@bad test]# ls | grep -E '^(a|A)bc$'
abc
Abc
[root@bad test]# ls | grep '(a|A)bc'
abc
Abc
abcd
t@bad test]# head -5 passwd
bad:x:0:0:bad:/bad:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@bad test]# grep '^daemon' passwd //过滤出以daemon开头的行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@bad test]# grep -A2 '^daemon' passwd //过滤出以daemon开头的行的后两行和本身
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@bad test]# grep -B1 '^daemon' passwd //过滤出以daemon开头的行的前一行和本身
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@bad test]# grep -C1 '^daemon' passwd //过滤出以daemon开头的行的前一行后一行和本身
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@bad test]# ls | grep '^a.c$' //过滤出a_c的文件
abc
[root@bad test]# ls | grep '^[0-9]$' //过滤出0-9的文件
1
2
3
4
5
6
7
8
9
[root@bad test]# ls | grep '^1*$' //过滤出*号前的字符出现任意次的文件
1
11
111
1111
[root@bad test]# ls | grep '^1.*$' //.表示任意单个字符,*表示前面一个字符的任意次
1
10
11
111
1111
12
13
14
15
16
17
18
19
[root@bad test]# ls | grep '^1+$' //匹配前字符的任意次数,作用与*相同
1
11
111
1111
[root@bad test]# ls | grep '^1{3}$' //匹配1出现3次的文件
111
[root@bad test]# ls | grep '^1{1,3}$' //匹配1出现至少一次至多三次的所有文件
1
11
111
[root@bad test]# ls | grep '^1{1,}$' //匹配1出现至少一次,至多无限次的文件
1
11
111
1111
[root@bad test]# ls | grep '^1{0,1}$' //匹配1出现至少次,至多1次的文件
1
[root@bad test]#
find
和grep
是两个比较重要的命令,同时他们的选项也会很多,所以需要多用,熟悉每个命令的作用
通配符
有时候我们存储的文件太多了,就不知道自己的东西存在哪里了。只依稀记得是以A开头的PDF文件,那我们要怎么去找呢?这个时候我们就可以用到通配符,帮助我们快速的找到文件了。在Windows中有款软件叫Everything(绝对好用!比Windows自带的搜索快很多倍!),是一款能够快速帮你找到文件的软件,它同样也支持通配符的使用。
- 文件名通配
*
匹配任意长度的任意字符?
匹配任意的单个字符[]
匹配指定范围内的任意单个字符- [abc],[a-m],[0-9]
[root@bad test]# ls
a aac aad ab abc abd ac adc bc be
[root@bad test]# ls a* //列出当前目录下所有的以a开头的文件
a aac aad ab abc abd ac adc
[root@bad test]# ls b* //列出当前目录下所有的以b开头的文件
bc be
[root@bad test]# ls a?c //列出名为a_c格式的文件
aac abc adc
[root@bad test]#
-
以上是常用的三种通配符,当然还有很多其他的通配符
[[:space:]]
表示空白字符[[:punct:]]
表示标点符号[[:lower:]]
表示小写字母[[:upper:]]
表示大写字母[[:alpha:]]
表示大小写字母[[:digit:]]
表示数字[[:alnum:]]
表示数字和大小写字母[^]
匹配指定范围之外的任意单个字符
[root@bad test]# touch {a..z} //创建a-z的文件
[root@bad test]# ls
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@bad test]# touch {A..Z} //创建A-Z的文件
[root@bad test]# ls
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
[root@bad test]# ls [a-z] //列出a-z文件
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y
[root@bad test]# ls [^a-z] //列出除了a-z的文件,即取反
Z
[root@bad test]#
重定向与管道
说真的,我在学习这里的时候,是真的迷。感觉很高大上,但奈何自己就是掌握不好,好在经常联系,反复的看相关的资料,最后也算基本掌握。
- 系统设定:
* 标准输入 STDIN 用数字0来表示
* 标准输出 STDOUT 用数字1来表示
* 标准错误输出 STDERR 用数字2来表示
- 这里还记得我们之前使用过的
echo $?
吗?判断上一条命令执行结果是否正确,0表示正确的,其他的数字都表示上一条命令有错误。
I/O重定向
重定向在前面我们也有了解到过,就是使用echo
将一段文本内容追加或是覆盖到某一文件中,就使用到了简单的重定向。
>
覆盖输出>>
追加输出2>
重定向错误输出2>>
追加重定向错误输出&>
覆盖重定向标准输出或错误输出至同一个文件&>>
追加重定向标准输出或错误输出至同一个文件<
输入重定向
[root@bad test]# echo "a b c" > bad //将a b c追加到文件bad中,覆盖
[root@bad test]# cat bad //查看文件bad中的文件
a b c
[root@bad test]# echo "1" >> bad //将1追加到文件bad中,不覆盖
[root@bad test]# echo "2" >> bad //将2追加到文件bad中,不覆盖
[root@bad test]# echo "3" >> bad //将3追加到文件bad中,不覆盖
[root@bad test]# cat bad //查看文件bad中的文件
a b c
1
2
3
<<
Here Document
[root@bad test]# cat > bad <<EOF //直接在屏幕输入写入文件bad中的内容,EOF保存
> a
> b
> c
> 1
> 2
> EOF
[root@bad test]# cat bad //查看文件bad中的文件
a
b
c
1
2
- 最后这种也是我们经常会用到的一种,当文件内容太多,我们不想打开编辑,一句一句的写入又太麻烦,就可以使用这种方法。
管道
- 将前一个命令的输出作为后一个命令的输入。最后一个命令会在当前shell进程的子shell进程中执行
- 用法:命令1 | 命令2 | 命令3 | …
[root@bad test]# cat anaconda-ks.cfg | wc -l //统计文件anaconda-ks.cfg的行数
47
[root@bad test]# cat anaconda-ks.cfg | wc -c //统计文件anaconda-ks.cfg的单词数
1196
[root@bad test]# cat anaconda-ks.cfg | wc -w //统计文件anaconda-ks.cfg的字节数
103
[root@bad test]#
tee
从标准输入读取数据,输出一份到屏幕上,一份保存到文件
[root@localhost ~]# echo "hello world" | tee /tmp/hello.out
hello world
[root@localhost ~]# cat /tmp/hello.out
hello world
- 在这里管道符
|
的前后要不要加空格看个人习惯,我习惯加空格,因为这样看起来更好看
引号的引用
引号的引用跟我们学习的很多编程语言里面的是一样的,这点不难。学到这里的时候,我才第一次知道 ` 这个叫反引号,是用Esc下面的按键打出来的。
``
反引号,键盘左上角Esc下面的键,用于命令替换""
双引号,弱引用,可以实现变量替换''
单引号,强引用,不完成变量替换
[root@bad test]# a=5
[root@bad test]# echo "$a"
5
[root@bad test]# echo '$a'
$a
[root@bad test]# echo $a
5
[root@bad test]#
- `` =$( ) 反引号语句当作命令执行一遍,再将结果加入到原命令中重新执行;
[root@bad test]# ls bad
1 2 3
[root@bad test]# a=`ls bad`
[root@bad test]# echo $a
1 2 3
[root@bad test]# echo `ls bad`
1 2 3
[root@bad test]# echo $(ls bad)
1 2 3
[root@bad test]#
获取命令帮助
当然,Linux可以说是一个纯命令的操作系统,那么问题就来了,那么多的命令,我怎么能清楚的记得每一个命令的用法呢?那万一我只记得命令,但是急不得它有什么用,或者说是怎么用的,那怎么办呢?这个时候我们就需要获取命令帮助了。
help、man
前面讲到过,在查看命令是内部命令还是外部命令使用type
这条命令。
- 内部命令
- 用法:
help
COMMAND
- 用法:
- 外部命令
- 用法:COMMAND
--help
- 用法:COMMAND
- 命令手册
- 用法:
man
COMMAND
- 用法:
man
是分章节的,以下是每一章节的内容介绍:
1 用户命令(/bin,/usr/bin,/usr/local/bin)
2 系统调用
3 库调用
4 特殊文件(设备文件)
5 文件格式(配置文件 的语法)
6 游戏
7 杂项(Miscellaneous)
8 管理命令(/sbin,/usr/sbin,/usr/local/sbin)
man
手册注意事项:[]
可选<>
必选...
可以出现多次|
多选一{}
分组NAME
命令名称及功能简要说明SYNOPSIS
用法说明,包括可用的选项DESCRIPTION
命令功能的详尽说明,可能包括每一个选项的意思OPTIONS
说明每一个选项的意义FILES
此命令相关的配置文件BUGS
报告bugEXAMPLES
使用示例SEE ALSO
另外参照
那么问题来了,进入man
手册之后,我们要怎么查阅,怎么翻页怎么退出呢?
-
man翻屏
- 向后翻一屏 SPACE,也就是空格
- 向前翻一屏 B
- 向后翻一行 Enter,回车
- 向前翻一行 K
-
查找
/
KEYWORD 向后查找KEYWORD?
KEYWORD 向前查找KEYWORDn
下一个N
前一个q
退出
组合键
- Ctrl+A 光标跳转至正在输入的命令行的首部
- Ctrl+E 光标跳转至正在输入的命令行的尾部
- Ctrl+W 删除光标之前的单词
- Ctrl+K 删除从光标到末行的所有字符
- Ctrl+U 删除从光标到首行的所有字符
- Ctrl+← 光标跳转到前一个单词词首
- Ctrl+→ 光标跳转到后一个单词词尾
- Ctrl+L 清屏,和clear命令等效
- Ctrl+C 终止前台运行的程序
- Ctrl+Z 将任务暂停,挂至后台
- Ctrl+D 在shell中,Ctrl-d表示退出当前shell
- Ctrl+R 搜索历史命令,利用关键字
在Linux中,使用ping
命令时,不会像Windows中一样会自己停下来,必须要使用Ctrl+C
终止ping命令。
如果有错误或不详尽的地方,还请留言指出。
本文链接: https://blog.csdn.net/qq_45668124/article/details/104382561
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!