3.0 重定向和文件的查找

重定向和文件的查找

本节所讲内容:

  1. 文件描述符 0、1、2
  2. 重定向的含义-管道的使用-tee命令
  3. which-whereis-locate-grep-find查找命令
  4. 命令判断
    Linux下一切皆文件
    文件又可分为:普通文件、目录文件、链接文件、设备文件
    LINUX系统使用文件来描述各种硬件设备资源,如:/dev/sda /dev/sdb /dev/sr0

1、文件描述符定义

文件描述符:是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以标明每一个被进程所打开的文件,程序刚刚启动的时候,第一个打开的文件是0,第二个是1,依此类推。也可以理解为是一个文件的身份ID
用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器)
在这里插入图片描述

1)输入输出标准说明

STDIN 标准输入 默认的设备是键盘 文件编号为:0
STDOUT 标准输出 默认的设备是显示器 文件编号为:1 ,也可以重定向到文件
STDERR 标准错误 默认的设备是显示器 文件编号为:2 ,也可以重定向到文件
例1:查看一个进程打开了哪些文件?
语法: ll /proc/进程ID/fd
例:

[root@CHENDAJIE ~]# vim /etc/passwd
[root@CHENDAJIE ~]# ps -aux | grep passwd
root       2152  0.3  0.2 151672  5388 pts/1    S+   16:53   0:00 vim /etc/passwd
root       2162  0.0  0.0 112676   980 pts/0    S+   16:53   0:00 grep --color=auto passwd
[root@CHENDAJIE ~]# ll /proc/2152/fd
总用量 0
lrwx------ 1 root root 64 10月 25 16:54 0 -> /dev/pts/1
lrwx------ 1 root root 64 10月 25 16:54 1 -> /dev/pts/1
lrwx------ 1 root root 64 10月 25 16:53 2 -> /dev/pts/1
lrwx------ 1 root root 64 10月 25 16:54 4 -> /etc/.passwd.swp

【注】: 这些0,1,2,4就是文件的描述符。一个进程启动时,都会打开 3 个文件:标准输入、标准输出和标准出错处理。这3 个文件分别对应文件描述符为 0、1和2也就是宏替换 STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。
/proc/进程ID/fd #这个fd目录下,专门存文件描述符

【注】:对文件描述符的操作就是对文件本身的操作。 我可以直接通过操作文件描述来修改文件
例2:查看和临时设置一个进程最多可以打开几个文件,即:一个进程可以打开的文件描述符限制

[root@CHENDAJIE ~]# ulimit -n	#查看一个进程最多可以同时打开的文件数
1024
[root@CHENDAJIE ~]# ulimit -n 2048	#修改一个进程最多可以同时打开的文件数为2048
[root@CHENDAJIE ~]# ulimit -n
2048

2) 重定向的含义-管道的使用-tee命令

1:输出重定向

定义:将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上
重定向输出使用”>” “>>” 操作符号
语法: > 文件名 #表示将标准输出的内容,写到后面的文件中,如果此文件名已经存在,将会覆盖原文件中的内容
>> 文件名 #表示将标准输出的内容,追加到后面的文件中。若重定向的输出的文件不存在,则会新建该文件
例1:查看当前主机的CPU的类型保存到cpu.txt文件中(而不是直接显示到屏幕上)

[root@CHENDAJIE ~]# cat /proc/cpuinfo > cpu.txt
[root@CHENDAJIE ~]# cat cpu.txt 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
						...

例2:将内核的版本信息追加到cpu.txt

[root@CHENDAJIE ~]# uname -a >> cpu.txt 
[root@CHENDAJIE ~]# tail cpu.txt 
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch epb fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt xsavec xgetbv1 dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
bogomips        : 4607.99
clflush size    : 64
cache_alignment : 64
address sizes   : 42 bits physical, 48 bits virtual
power management:

Linux CHENDAJIE.cn 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

例3:清空一个文件

[root@CHENDAJIE ~]# > cpu.txt 
[root@CHENDAJIE ~]# cat cpu.txt 
[root@CHENDAJIE ~]# 
2:输入重定向

例1:将命令中接收输入的途径由默认的键盘改为其他文件.而不是等待从键盘输入

[root@CHENDAJIE ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@CHENDAJIE ~]# grep root < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
3:EOF

EOF本意是 End Of File,表明到了文件末尾。”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“,再次返回到主调shell,可将其理解为分界符(delimiter)。既然是分界符,那么形式自然不是固定的,这里可以将”EOF“可以进行自定义,但是前后的”EOF“必须成对出现且不能和shell命令冲突。
例1:以<<EOF开始,以EOF结尾 。

[root@CHENDAJIE test]# cat > a.txt <<EOF
> I
> do
> !
> EOF
[root@CHENDAJIE test]# cat a.txt 
I
do
!

例2:以ccc作为分界符

[root@CHENDAJIE test]# cat > a.txt <<ccc
> eof
> EOF
> ccc
[root@CHENDAJIE test]# cat a.txt 
eof
EOF

例3:在脚本中我们可以通过重定向输入来打印消息菜单
在使用的时候需要在”<< “右边跟一对终止符。终止符是可以自定义

[root@CHENDAJIE test]# vim p.sh	#写入以下内容
  1 !/bin/bash
  2 #
  3 cat <<efo
  4 
  5 ===============================================
  6 1.mysql
  7 2.httpd
  8 3.oracle
  9 
 10 ===============================================
 11 efo
 12 
[root@CHENDAJIE test]# chmod u+x p.sh 
[root@CHENDAJIE test]# ./p.sh 

===============================================
1.mysql
2.httpd
3.oracle

===============================================
4:错误重定向’

将命令执行过程中出现的错误信息 (选项或参数错误) 保存到指定的文件,而不是直接显示到显示器
作用:错误信息保存到文件
操作符: 错误重定向符号:2> ; 标准输入: 1< 或简写 < ; 标准输出: 0> 或 >
2指的是标准错误输出的文件描述符 (在使用标准的输入和输出省略了1、0 编号)
在实际应用中,错误重定向可以用来收集执行的错误信息.为排错提供依据;对于shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁
例1: 将错误显示的内容和正确显示的内容分开

[root@CHENDAJIE test]# ls /etc/passwd xxx
ls: 无法访问xxx: 没有那个文件或目录
/etc/passwd
[root@CHENDAJIE test]# ls /etc/passwd xxx > a.txt
ls: 无法访问xxx: 没有那个文件或目录
[root@CHENDAJIE test]# cat a.txt 
/etc/passwd
[root@CHENDAJIE test]# ls /etc/passwd xxx 2> a.txt
/etc/passwd
[root@CHENDAJIE test]# cat a.txt 
ls: 无法访问xxx: 没有那个文件或目录

【注】:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符

5:null黑洞和zero空文件

1、把/dev/null看作"黑洞",所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而 /dev/null对命令行和脚本都非常的有用.

[root@CHENDAJIE test]# echo adsdas > /dev/null
[root@CHENDAJIE test]# cat /dev/null
[root@CHENDAJIE test]# 

2、/dev/zero在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。典型用法是用它来产生一个特定大小的空白文件
例:使用dd命令产生一个50M的文件
参数:

if代表输入文件。如果不指定if,默认就会从stdin中读取输入。
of代表输出文件。如果不指定of,默认就会将stdout作为默认输出。
bs代表字节为单位的块大小。
count代表被复制的块数。
[root@CHENDAJIE test]# dd if=/dev/zero of=b.txt bs=1M count=50
记录了50+0 的读入
记录了50+0 的写出
52428800字节(52 MB)已复制,0.112061 秒,468 MB/秒
[root@CHENDAJIE test]# du -sh b.txt 
50M     b.txt
[root@CHENDAJIE test]# cat b.txt 	#什么也不显示
[root@CHENDAJIE test]# 

例2:正确的内容写入一个文件,错误的写入一个文件

[root@CHENDAJIE test]# ls /tmp xxx >ok.txt 2>err.txt
[root@CHENDAJIE test]# cat ok.txt 
/tmp:
systemd-private-28c1f866810a40ffa36ca2fffce1b4e3-colord.service-QN68OJ
systemd-private-28c1f866810a40ffa36ca2fffce1b4e3-cups.service-9L99TB
systemd-private-28c1f866810a40ffa36ca2fffce1b4e3-rtkit-daemon.service-K3ML9P
systemd-private-28c1f866810a40ffa36ca2fffce1b4e3-vgauthd.service-wXJlG1
systemd-private-28c1f866810a40ffa36ca2fffce1b4e3-vmtoolsd.service-yvKphd
systemd-private-a02a5db6c8454537a08fa4de6a852cd6-colord.service-EEIS1y
systemd-private-a02a5db6c8454537a08fa4de6a852cd6-cups.service-dQTPHo
systemd-private-a02a5db6c8454537a08fa4de6a852cd6-rtkit-daemon.service-zdMOAY
systemd-private-a02a5db6c8454537a08fa4de6a852cd6-vgauthd.service-LDvCtQ
systemd-private-a02a5db6c8454537a08fa4de6a852cd6-vmtoolsd.service-4HGSK6
tracker-extract-files.1000
yum_save_tx.2019-10-23.16-14.9yt0gr.yumtx
yum_save_tx.2019-10-25.09-35.OrmdFW.yumtx
yum_save_tx.2019-10-25.09-36.lxmzrR.yumtx
[root@CHENDAJIE test]# cat err.txt 
ls: 无法访问xxx: 没有那个文件或目录		
[root@CHENDAJIE test]# ls
a.txt  b.txt  err.txt  ok.txt  p.sh
6: &>和>&符号

&表示等同于的意思
例1:把正确和错误的消息输入到相同的位置
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误重定向到标准输出
例2:把正确和错误的消息输入到相同的位置

[root@CHENDAJIE test]# ls /tmp xxx >1.txt 2>&1
[root@CHENDAJIE test]# ls
1.txt
[root@CHENDAJIE test]# cat 1.txt 
ls: 无法访问xxx: 没有那个文件或目录
/tmp:
systemd-private-28c1f866810a40ffa36ca2fffce1b4e3-colord.service-QN68OJ
systemd-private-28c1f866810a40ffa36ca2fffce1b4e3-cups.service-9L99TB
systemd-private-28c1f866810a40ffa36ca2fffce1b4e3-rtkit-daemon.service-K3ML9P
systemd-private-28c1f866810a40ffa36ca2fffce1b4e3-vgauthd.service-wXJlG1
systemd-private-28c1f866810a40ffa36ca2fffce1b4e3-vmtoolsd.service-yvKphd
systemd-private-a02a5db6c8454537a08fa4de6a852cd6-colord.service-EEIS1y
systemd-private-a02a5db6c8454537a08fa4de6a852cd6-cups.service-dQTPHo
systemd-private-a02a5db6c8454537a08fa4de6a852cd6-rtkit-daemon.service-zdMOAY
systemd-private-a02a5db6c8454537a08fa4de6a852cd6-vgauthd.service-LDvCtQ
systemd-private-a02a5db6c8454537a08fa4de6a852cd6-vmtoolsd.service-4HGSK6
tracker-extract-files.1000
yum_save_tx.2019-10-23.16-14.9yt0gr.yumtx
yum_save_tx.2019-10-25.09-35.OrmdFW.yumtx
yum_save_tx.2019-10-25.09-36.lxmzrR.yumtx
7:管道 | 的使用

语法:command-a | command-b | command-c | …
【注意】:
1、管道命令只处理前一个命令正确输出,不处理错误输出
2、管道右边的命令,必须能够接收标准输入的数据流命令才行
3、管道符可以把两条命令连起来,它可以链接多个命令使用

[root@CHENDAJIE test]# ps -aux | grep sshd
root        988  0.0  0.2 106016  4096 ?        Ss   16:06   0:00 /usr/sbin/sshd -D
root       1389  0.0  0.2 150420  5440 ?        Ss   16:06   0:02 sshd: root@pts/0
root       1555  0.0  0.2 150420  5444 ?        Ss   16:06   0:00 sshd: root@pts/1
root       3181  0.0  0.0 112680   984 pts/0    S+   18:19   0:00 grep --color=auto sshd
8: tee命令(了解)

功能:读取标准输入的数据,并将其内容输出成文件。
语法:tee [-a][–help][–version][文件…]
参数
-a, --append 内容追加到给定的文件而非覆盖
–help  在线帮助
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件

例1:将磁盘使用的信息写入文件

[root@CHENDAJIE test]# df -h | tee disk.log
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        10G  7.0G  3.1G   70% /
devtmpfs        898M     0  898M    0% /dev
tmpfs           912M     0  912M    0% /dev/shm
tmpfs           912M  9.1M  903M    1% /run
tmpfs           912M     0  912M    0% /sys/fs/cgroup
/dev/sr0        4.3G  4.3G     0  100% /mnt
/dev/sda1       197M  152M   45M   78% /boot
tmpfs           183M   12K  183M    1% /run/user/42
tmpfs           183M     0  183M    0% /run/user/0
[root@CHENDAJIE test]# ls
1.txt  disk.log
[root@CHENDAJIE test]# cat disk.log 
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        10G  7.0G  3.1G   70% /
devtmpfs        898M     0  898M    0% /dev
tmpfs           912M     0  912M    0% /dev/shm
tmpfs           912M  9.1M  903M    1% /run
tmpfs           912M     0  912M    0% /sys/fs/cgroup
/dev/sr0        4.3G  4.3G     0  100% /mnt
/dev/sda1       197M  152M   45M   78% /boot
tmpfs           183M   12K  183M    1% /run/user/42
tmpfs           183M     0  183M    0% /run/user/0

例2:将文件系统使用的信息追加到文件

[root@CHENDAJIE test]# df -h | tee -a disk.log 
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        10G  7.0G  3.1G   70% /
devtmpfs        898M     0  898M    0% /dev
tmpfs           912M     0  912M    0% /dev/shm
tmpfs           912M  9.1M  903M    1% /run
tmpfs           912M     0  912M    0% /sys/fs/cgroup
/dev/sr0        4.3G  4.3G     0  100% /mnt
/dev/sda1       197M  152M   45M   78% /boot
tmpfs           183M   12K  183M    1% /run/user/42
tmpfs           183M     0  183M    0% /run/user/0
[root@CHENDAJIE test]# cat disk.log 
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        10G  7.0G  3.1G   70% /
devtmpfs        898M     0  898M    0% /dev
tmpfs           912M     0  912M    0% /dev/shm
tmpfs           912M  9.1M  903M    1% /run
tmpfs           912M     0  912M    0% /sys/fs/cgroup
/dev/sr0        4.3G  4.3G     0  100% /mnt
/dev/sda1       197M  152M   45M   78% /boot
tmpfs           183M   12K  183M    1% /run/user/42
tmpfs           183M     0  183M    0% /run/user/0
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        10G  7.0G  3.1G   70% /
devtmpfs        898M     0  898M    0% /dev
tmpfs           912M     0  912M    0% /dev/shm
tmpfs           912M  9.1M  903M    1% /run
tmpfs           912M     0  912M    0% /sys/fs/cgroup
/dev/sr0        4.3G  4.3G     0  100% /mnt
/dev/sda1       197M  152M   45M   78% /boot
tmpfs           183M   12K  183M    1% /run/user/42
tmpfs           183M     0  183M    0% /run/user/0

3)which-whereis-locate-grep-find查找命令

1: which-whereis-locate-grep find命令使用

查找文件一般有以下几个命令:

which查看可执行文件的位置
whereis查看可执行文件的位置及相关文件
locate配合数据库缓存,快速查看文件位置
grep过滤匹配,它是一个文件搜索工具
find查找相关文件

which
例:

[root@CHENDAJIE test]# which cd
/usr/bin/cd
[root@CHENDAJIE test]# whereis cd 
cd: /usr/bin/cd /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
[root@CHENDAJIE test]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

locate
locate命令和find -name 功能差不多,是它的另外一种写法,但是这个要比find搜索快的多,因为find命令查找的是具体目录文件,而locate它搜索的是一个数据库/var/lib/mlocate/mlocate.db,这个数据库中存有本地所有的文件信息;这个数据库是Linux自动创建并每天自动更新维护。相关的配置信息在/etc/updatedb.conf,查看定时任务信息在/etc/cron.daily/mlocate
例:

[root@CHENDAJIE test]# touch chendajie.txt
[root@CHENDAJIE test]# locate chendajie.txt 	#发现找不到
[root@CHENDAJIE test]# updatedb 	#如果对当天文件查找,需要手动更新数据库updatedb
[root@CHENDAJIE test]# locate chendajie.txt 
/root/test/chendajie.txt

grep查找使用
作用:过滤,它能够使用正则表达式来搜索文本,并把结果打印出来
参数:

-v取反
-i忽略大小写
^#以#开头
#$以#结尾
^$空行
-n对过滤的内容加上行号
|或者的意思

[root@CHENDAJIE test]# ps -aux | grep sshd | grep -v grep
root        988  0.0  0.2 106016  4096 ?        Ss   16:06   0:00 /usr/sbin/sshd -D
root       1389  0.0  0.2 150420  5440 ?        Ss   16:06   0:03 sshd: root@pts/0
root       1555  0.0  0.2 150420  5444 ?        Ss   16:06   0:00 sshd: root@pts/1
[root@CHENDAJIE test]# grep bash$ /etc/passwd	#查找以bash结尾的字段
root:x:0:0:root:/root:/bin/bash
chendajie:x:1000:1000:chendajie:/home/chendajie:/bin/bash
oracle:x:1111:1100::/opt/oracle:/sbin/bash
[root@CHENDAJIE test]# grep "niligin\|root" /etc/passwd | wc -l
2

【注】: \ 表示转义符

[root@CHENDAJIE test]# egrep "nologin|root" /etc/passwd | wc -l
38

【注】egrep 是 grep加强版本

2:find命令使用(必会,参数比较多)

格式:find pathname -options [-print]
命令字 路径名称 选项 输出
参数
pathname: find命令所查找的目录路径,不输入代表当前目录例如用 . 来表示当前目录,用 / 来表示系统根目录。
find命令选项:
-name 按照文件名查找文件。 “名称”
-perm 按照文件权限来查找文件。666 777 等
-user 按照文件属主来查找文件
-group 按照文件所属的组来查找文件
-mtime -n / +n 按照文件的更改时间来查找文件,
- n 表示文件更改时间距现在n天以内
+ n 表示文件更改时间距现在n天以前
-type 查找某一类型的文件
b - 块设备文件
d - 目录
c - 字符设备文件
p - 管道文件
l- 符号链接文件
f - 普通文件
-size n 查找符合指定的文件大小的文件
-exec 对匹配的文件执行该参数所给出的其他linux命令, 相应命令的形式为’ 命令 {} ;,注意{ }和 \;之间的空格,{}代表查到的内容

例1:查看当前目录下所有的TXT格式的文件

[root@CHENDAJIE test]# find -name "*.txt"
./1.txt
./chendajie.txt

2、按照更改时间或访问时间等查找文件
如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项

mtime: 文件最后一次修改的时间
atime: 最后一次访问时间
ctime: 文件的最后一次变化时间,也就是修改时间
例1:希望在root目录下查找更改时间在1天以内,被黑客修改的文件

[root@CHENDAJIE test]# find /root/ -mtime -1
/root/
/root/.cache/abrt
/root/.cache/abrt/lastnotification
/root/.bash_history
/root/usr-tar.gz
/root/vimrc
/root/.viminfo
/root/test
/root/test/1.txt
/root/test/disk.log
/root/test/chendajie.txt

3、对查找内容执行相应命令
-exec 这个选项参数后面可以跟自定义的SHELL命令,格式如下:
在这里插入图片描述
例2:

[root@CHENDAJIE test]# find -name "*.back" -exec ls -l {} \;
-rw-r--r-- 1 root root 0 10月 25 18:50 ./1.back
-rw-r--r-- 1 root root 0 10月 25 18:50 ./2.back
-rw-r--r-- 1 root root 0 10月 25 18:50 ./3.back

例3:

root@CHENDAJIE test]# ls
1.back  1.txt  2.back  3.back  chendajie.txt  disk.log
[root@CHENDAJIE test]# mkdir find
[root@CHENDAJIE test]# find -name "*.back" -exec mv {} ./find \;
mv: "./find/1.back""./find/1.back" 为同一文件
mv: "./find/2.back""./find/2.back" 为同一文件
mv: "./find/3.back""./find/3.back" 为同一文件
[root@CHENDAJIE test]# cat find/
cat: find/: 是一个目录
[root@CHENDAJIE test]# tree find/
find/
├── 1.back
├── 2.back
└── 3.back

0 directories, 3 files

例4:把查找到的文件复制到一个指定的目录

[root@CHENDAJIE test]# ls
1.txt  chendajie.txt  disk.log  find
[root@CHENDAJIE test]# find /root -name "*.txt" -exec cp {} /opt \;
[root@CHENDAJIE test]# ls /opt/
1.txt  chendajie.txt

例5:xargs和find命令结合 复制文件 -i 表示 find 传递给xargs的结果 由{}来代替 (了解)

[root@CHENDAJIE test]# rm -rf /opt/*
[root@CHENDAJIE test]# ls /opt/
[root@CHENDAJIE test]# find -name "*.txt" | xargs -i cp {} /opt/
[root@CHENDAJIE test]# ls /opt/
1.txt  chendajie.txt

例6:查找多个类型文件
比较符的使用:
-a and 并且
-o or 或者
+ 超过
- 低于
1、查找.sh文件或.pdf文件

[root@CHENDAJIE test]# touch a.pdf back.sh
[root@CHENDAJIE test]# find -name "*.sh" -o -name "*.pdf"
./a.pdf
./back.sh

2、查找大于20K的文件并输出数量

[root@CHENDAJIE test]# find /etc -size +20k | wc -l
49

3、查找大于20K并小于50K的文件并输出数量

[root@CHENDAJIE test]# find /etc -size +20k -a -size -50k | wc -l
22

例7: 按权限查找:-perm

[root@CHENDAJIE test]# find /bin/ -perm 755		#查找权限是0755的文件或目录
[root@CHENDAJIE test]# find /bin/ -perm -644	#-perm -644  至少有644权限的文件或目录

【例】:查看系统中权限至少为777的文件或目录
创建一些测试文件:

[root@CHENDAJIE test]# mkdir ccc
[root@CHENDAJIE test]# chmod 777 ccc
[root@CHENDAJIE test]# mkdir test
[root@CHENDAJIE test]# chmod 1777 test
[root@CHENDAJIE test]# touch b.sh
[root@CHENDAJIE test]# chmod 4777 b.sh

查找:

[root@CHENDAJIE test]# find /root/ -perm 777
/root/test/ccc
[root@CHENDAJIE test]# find /root/ -perm 1777
/root/test/test
[root@CHENDAJIE test]# find /root/ -perm 4777
/root/test/b.sh

【例】:把系统中权限不低于777的危险目录查找出来

[root@CHENDAJIE test]# find /root/ -perm -777
/root/test/ccc
/root/test/test
/root/test/b.sh

【例】:把系统中权限不低于777的危险文件查找出来

[root@CHENDAJIE test]# find / -type f -perm -777

例8:查找的目录深度:
-maxdepth 1 #只查找目录第一层的文件和目录
如:查找/bin目录下权限等于755的可执行的文件

[root@CHENDAJIE test]# find /bin/ -maxdepth 1 -perm 755		#/bin后面要有/

例9:查找系统中所有属于用户mk的文件,并把这个文件,放到/root/findresults目录下
【注意】:/root/findresults这个需要提前创建好。

[root@CHENDAJIE test]# mkdir /root/findresults
[root@CHENDAJIE test]# find / -user chendajie -exec cp -a {} /root/findresults/ \;
find: ‘/proc/4401/task/4401/fd/6’: 没有那个文件或目录
find: ‘/proc/4401/task/4401/fdinfo/6’: 没有那个文件或目录
find: ‘/proc/4401/fd/6’: 没有那个文件或目录
find: ‘/proc/4401/fdinfo/6’: 没有那个文件或目录
cp: 无法以目录"/home/chendajie" 来覆盖非目录"/root/findresults/chendajie"

互动: 同一个目录下,可以创建文件mk和文件夹mk吗?同一个目录下创建的文件名和目录名一样吗?
答:不可以

[root@CHENDAJIE test]# find / -user chendajie		#发现
[root@CHENDAJIE test]# ll /var/spool/mail/chendajie	#查看这个文件
-rw-rw----. 1 chendajie mail 0 9月  24 21:39 /var/spool/mail/chendajie
[root@CHENDAJIE test]# ll /home/chendajie

发现/var/spool/mail/chendajie 和/home/chendajie 的名字是一样的。 而两者都要复制到/root/findresults/下,先复制了/var/spool/mail/chendajie,所以/home/chendajie就不能复制了。
将其中一个重命名就可以复制了

[root@CHENDAJIE test]# mv /var/spool/mail/chendajie  /var/spool/mail/chendajie.mail  #将其中一个重命名
[root@CHENDAJIE test]# rm -rf /root/findresults/*
[root@CHENDAJIE test]# find / -user chendajie -exec cp -a {} /root/findresults/ \;
find: ‘/proc/5081/task/5081/fd/6’: 没有那个文件或目录
find: ‘/proc/5081/task/5081/fdinfo/6’: 没有那个文件或目录
find: ‘/proc/5081/fd/6’: 没有那个文件或目录
find: ‘/proc/5081/fdinfo/6’: 没有那个文件或目录
cp: "/root/findresults/.esd-1000""/root/findresults/.esd-1000" 为同一文件
cp: "/root/findresults/.mozilla""/root/findresults/.mozilla" 为同一文件
cp: "/root/findresults/.cache""/root/findresults/.cache" 为同一文件
cp: "/root/findresults/.config""/root/findresults/.config" 为同一文件
cp: "/root/findresults/.ICEauthority""/root/findresults/.ICEauthority" 为同一文件
cp: "/root/findresults/.local""/root/findresults/.local" 为同一文件
cp: "/root/findresults/.meta.isrunning""/root/findresults/.meta.isrunning" 为同一文件
cp: "/root/findresults/.esd_auth""/root/findresults/.esd_auth" 为同一文件
cp: "/root/findresults/.vimrc""/root/findresults/.vimrc" 为同一文件
cp: "/root/findresults/.bash_logout""/root/findresults/.bash_logout" 为同一文件
cp: "/root/findresults/.bash_profile""/root/findresults/.bash_profile" 为同一文件
cp: "/root/findresults/.bashrc""/root/findresults/.bashrc" 为同一文件
cp: "/root/findresults/.bash_history""/root/findresults/.bash_history" 为同一文件
cp: "/root/findresults/.viminfo""/root/findresults/.viminfo" 为同一文件
[root@CHENDAJIE test]# mv /var/spool/mail/chendajie.mail  /var/spool/mail/chendajie	#复制完再将名字改回来就可以了

4、命令判断

1) 用到的三个特殊符号: ; && ||

1、 ;分号 不考虑指令的相关性,连续执行, 分号; 不保证命令全部执行成功的

[root@CHENDAJIE test]# ls ; tree
a
.
└── a
    └── b

2 directories, 0 files

2、&& 逻辑与====》它是只有在前面的命令执行成功后,后面的命令才会去执行
例1:如果/opt目录存在,则在/opt下面新建一个文件a.txt

[root@CHENDAJIE test]# cd /opt/ && touch /opt/a.txt && ls
a.txt
[root@CHENDAJIE opt]# 

例2:源码编译经典使用方法

[root@CHENDAJIE opt]# ./configure  &&  make -j 4 &&  make install 

3、 || 逻辑或===》如果前面的命令执行成功,后面的命令就不去执行了;或者如果前面的执行不成功,才会去执行后面的命令
例1:

[root@CHENDAJIE opt]# ll xxx || cd /mnt/
ls: 无法访问xxx: 没有那个文件或目录
[root@CHENDAJIE mnt]# 
[root@CHENDAJIE test]# ls
a
[root@CHENDAJIE test]# ll a || cd /mnt
总用量 0
drwxr-xr-x 2 root root 6 10月 25 19:47 b
[root@CHENDAJIE test]# 

总结
在这里插入图片描述
运算顺序:LINUX执行命令,是从左到右一个一个执行,从上到下执行
总结:

  1. 文件描述符 0、1、2
  2. 重定向的含义-管道的使用-tee命令
  3. which-whereis-locate-grep-find查找命令
  4. 命令判断
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值