04.Linux文件管理

1. 文件管理概述

Linux文件管理, 无非是对一个文件进行、创建、复制、移动、查看、编辑、压缩、查找、删除、等等  

2. 系统目录结构

2.1 目录结构
几乎所有的计算机操作系统都是使用目录结构组织文件,具体来说就是在一个目录中存放子目录和文件,
而在子目录中又会进一步存放子目录和文件, 以此类推形成一个树状的文件结构,
由于其结构很像一棵树的分支, 所以该结构又被称为“目录树”.  

Windows:以多根的方式组织文件 C:D: 
Linux:以单根的方式组织文件 /

如下图为Centos7的目录结构(> 虚线表示软链接)  
在Linux7系统中

/bin, /sbin, /lib, /lib64都以软链接的形式链接到/usr/目录下

/bin > /usr/bin  
/sbin > /usr/sbin  
lib -> usr/lib  
lib64 -> usr/lib64

img

2.2 存放命令相关的目录
/bin,  普通用户使用的命令 /bin/ls, /bin/date ...
/sbin, 管理员使用的命令 /sbin/service, poweroff, useradd ...
只要看到bin路径, 就应该意识到放的是可执行文件
2.3 存放用户相关数据的家目录
不同的用户拥有自己单独的数据.
/home, 普通用户的家目录, 默认为/home/username
/root, 超级管理员root的家目录, 普通用户无权操作  
2.4 系统文件目录
/usr, 相当于C:Windows  
[root@kid ~]# ls /usr
bin  games    lib    libexec  sbin   src
etc  include  lib64  local    share  tmp
/usr/etc, 存放.conf后缀的配置文件(目前空的...)
/usr/local, 内置软件安装的目录, 相当于C:Program  (现在一般安装的软件, 不放在/usr/local下了)
标准实现自动化的基础: 不同主机的相同的软件, 都放在相同路径下, 便于管理, 实现自动化.
[root@kid ~]# ls /usr/local
bin  games    lib    libexec  share
etc  include  lib64  sbin     src

/usr/bin/, 普通用户使用的应用程序(重要)  
/usr/sbin, 管理员使用的应用程序(重要)  
# 普通用户命令
[root@kid ~]# ls /usr/bin
addr2line
alias
...

# 条数
[root@kid ~]# ls -a /usr/bin | wc -l
749

# 超级用户命令
[root@kid ~]# ls /usr/sbin
accessdb             
dmeventd  
...

# 条数
[root@kid ~]# ls -a /usr/sbin | wc -l
427
/usr/lib, 库文件Glibc 32bit  (相当于windows的.dll动态链接库文件)
/usr/lib64, 库文件Glibc 64bit
# linux的库文件后缀.so.版本号
[root@kid ~]# ls /usr/lib64
libstdc++.so.6
libstdc++.so.6.0.19
...

# 查看命令依赖那些库文件  
[root@kid ~]# ldd /bin/ls 
	linux-vdso.so.1 =>  (0x00007ffc8d32f000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fe1ef5b9000)
	...
2.5 磁盘占用率
df -h查看系统中文件的使用情况  
 [root@kid ~]f -h
# 文件系统        分割区总容量 | 已使用的大小 | 剩下的大小 | 使用的百分比 | 路径地址 
Filesystem               Size    Used        Avail      Use%           Mounted on
devtmpfs                 475M       0         475M        0%           /dev
tmpfs                    487M       0         487M        0%           /dev/shm
tmpfs                    487M    7.5M         479M        2%           /run
tmpfs                    487M       0         487M        0%           /sys/fs/cgroup
/dev/mapper/centos-root  8.0G    1.3G         6.8G       16%           /
/dev/sda1               1014M    138M         877M       14%           /boot
tmpfs   
du -sh * 查看当前目录下各个文件及目录占用空间大小  
# 查看当前目录下各个文件及目录占用空间大小  
[root@kid ~]# du -sh * 
4.0K	anaconda-ks.cfg


# 查看指定目录的占用空间
[root@kid ~]# du -sh /usr/  
1.1G	/usr/

2.6 启动文件目录
/boot 存放的系统启动相关的文件
[root@kid ~]# ls /boot  
config-3.10.0-1160.el7.x86_64
efi
grub (引导装载程序)
grub2
initramfs-0-rescue-32dffdf5469a4d538f9b2c246727e087.img
initramfs-3.10.0-1160.el7.x86_64.img
symvers-3.10.0-1160.el7.x86_64.gz
System.map-3.10.0-1160.el7.x86_64
vmlinuz-0-rescue-32dffdf5469a4d538f9b2c246727e087
vmlinuz-3.10.0-1160.el7.x86_64 (linux的内核, 系统启动是默认选择)

image-20220810154615184

2.7 配置文件目录
/etc, 极其重要, 后续所有服务的配置都在这个目录中  
/etc/hostname, 系统主机名配置文件, 主机名很重要, 有些特殊服务要依赖主机名,
没有主机名会报错起不来;修改了要重启:reboot  
# 查看主机名
[root@kid ~]# cat /etc/hostname 
kid
/etc/sysconfig/network-scripts/ifcfg-ens32 , 网络配置文件  (可能不叫ens32)
[root@kid ~]# cat  /etc/sysconfig/network-scripts/ifcfg-ens32 
# 以太网网络类型:Ethernet,Static
TYPE=Ethernet

# 代理方式
PROXY_METHOD=none

# 只是浏览器
BROWSER_ONLY=no

#  网卡协议 获取网卡IP的方式
#  dhcp:    动态主机配置协议
#  static:  手动配置固定IP
#  none:    手动配置固定IP
BOOTPROTO=static


#  默认路由:是  
#  如果IP数据包中的目的地址找不到存在的其他路由时,
#  路由器会默认的选择路由
DEFROUTE=yes


#  是否开启IPV4致命错误检测:否
IPV4_FAILURE_FATAL=no

#  IPV6初始化: 是
IPV6INIT=yes


#  IPV6是否自动配置:是
IPV6_AUTOCONF=yes

#  IPV6 默认路由:是
IPV6_DEFROUTE=yes

#  是否开启IPV6致命错误检测:否
IPV6_FAILURE_FATAL=no

#  IPV6地址生成模型  stable-privacy:一种生成IPV6的策略
IPV6_ADDR_GEN_MODE=stable-privacy

#  网卡名称
NAME=ens32

# 网卡的唯一标识
UUID=fdfd5f3d-5f2e-432e-a5f8-161f831c7cd3

# 网卡设备名称,物理设置名字,最终通信地址
DEVICE=ens32
#  系统启动时是否激活网卡
ONBOOT=yes
# ip地址
IPADDR=10.0.0.200
# 子网掩码的位数长度
PREFIX=24
# 网关
GATEWAY=10.0.0.254
# DNS解析服务器地址
DNS1=8.8.8.8
DNS2=8.8.8.4
# 是否启用ipv6地址
IPV6_PRIVACY=no

# 最大传输单元
MTU=1
# 修改网卡配置文件之后重启服务生效, 重启网卡服务命令
[root@kid ~]# service network restart
/etc/resolv.conf, dns客户端配置文件, 域名解析服务器, 
一般我们不配置, 因为网卡的配置好了DNS解析服务器地址, 会覆盖掉这里的配置, 网卡的优先级高  
在修改ifcfg-ens32的DNS配置, resolv.conf 会自动变化...
[root@kid ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 8.8.8.4

/etc/hosts, 本地域名解析配置文件, 域名解析, 先从本地的hosts文件中查找, 没有找到再去域名解析服务器查找
/etc/hosts 对应windows C:windows/system32/drivers/etc/hosts,   
# 1. 下载httd(httpd是Apache超文本传输协议(HTTP)服务器的主程序)
[root@kid ~]# yum install net-tool
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirrors.cn99.com
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.cn99.com
...
# 2. 关闭防火墙
[root@kid ~]# systemctl stop firewalld  
# 3. 创建index页面
[root@kid ~]# echo "hello word" >/var/www/html/index.html  

# 4. 重启httd服务
[root@kid ~]# systemctl start httpd  
* 5. windows浏览器中访问linux
自己的ip:端口(固定80) 
10.0.0.1.100:80

image-20220810194638730

* 6. 到windows电脑的 C:\Windows\System32\drivers\etc 目录下找打hosts文件
	 将hosts文件只读模式取消(需要获取管理员权限)

image-20220810194957353

image-20220810195453926

image-20220810195214367

* 7. 使用编辑器打开文件, 在末尾添加以下配置
# 自定义DNS解析 (格式: ip 域名)
10.0.0.100 www.centos7.com
# 8. 打开cmd提示符窗口, 刷新dns
C:\Users\13600>ipconfig /flushdns

Windows IP 配置

已成功刷新 DNS 解析缓存。

image-20220810200110339

* 9. windows浏览器中访问 www.centos7.com
     经过hosts文件将www.centos7.com解析为10.0.0.100, 再访问.

image-20220810200411510

2.8 可变的目录与临时目录
/var,     存放一些变化文件, 比如/var/log/下的日志文件, 登陆日志  ...
/var/tmp, 进程产生的临时文件  
/tmp,     系统临时目录, 谁都可以使用
# 查看登陆日志  
cat /var/log/secure # 查看登陆时间  
Aug 11 03:41:00 kid polkitd[657]: Unregistered Authentication Agent for unix-process:1606:152514  
(system bus name :1.45, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, 
locale en_US.UTF-8) (disconnected from bus)

2.9 设备目录文件
/dev, 存放设备文件, 比如硬盘, 硬盘分区, 光驱, 等等  
/dev/sd* 硬盘设备  
[root@kid ~]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2

# linux中磁盘文件叫sd, 第一个硬盘叫a, 第二个叫b, ...
# sda1表示第一个磁盘的第一个分区, sda1表示第一个磁盘的第二个分区,
# 服务可以插很多硬盘
/dev/null, 黑洞设备, 只进不出, 类似于垃圾回收站  
# 将输出的信息放入黑洞, 终端不在展示
[root@kid ~]#  ls >/dev/null  
/dev/random, 生成随机数的设备 
 /dev/zero, 源源不断地产生数据
 
 dd:用指定大小的块拷贝一个文件, 并在拷贝的同时进行指定的转换,
 if=文件名:输入文件名, 缺省为标准输入, 即指定源文件, < if=input file >  
 of=文件名:输出文件名, 缺省为标准输出, 即指定目的文件, < of=output file >  
 bs=bytes:同时设置读入/输出的块大小为bytes个字节,
 count=blocks:仅拷贝blocks个块, 块大小等于ibs指定的字节数.
# 查看当前目录下的文件
[root@kid ~]#  ls 
anaconda-ks.cfg

# 获取一个1MB的文件
[root@kid ~]# dd if=/dev/zero of=test.txt bs=1k count=1024  
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.00346809 s, 302 MB/s

# 再次查看, 多出一个text.txt的文本文件
[root@kid ~]# ls
anaconda-ks.cfg  test.txt

# du显示的是文件所占blok的大小,block默认是4k
[root@kid ~]# du -sh ./*
4.0K	./anaconda-ks.cfg
1.0M	./test.txt

# ll -h查看的是文件内容的实际大小
[root@kid ~]# ll -h
total 1.1M
-rw-------. 1 root root 1.3K Aug 11 01:48 anaconda-ks.cfg
-rw-r--r--. 1 root root 1.0M Aug 11 04:34 test.txt

2.10 虚拟的文件系统
/proc, 反映系统当前进程的实时状态 :process  
如对应的进程停止则/proc下对应目录则会被删除
# 可以看到很多id号(pid号, 进程号, 唯一)
[root@kid ~]#ls /proc 

image-20220810204223233

# ls 进程id号的文件夹  
[root@kid ~]# ls /proc/1
attr       clear_refs       cpuset   fd       limits     mem         net        oom_score     
...
如果进程被关闭, id号的文件夹就没了  
id号每次启动都不唯一, 只有一个进程唯一, systemd 是进程号1的进程, 所有进程都是基于它派生出来的.  
2.11 其他
media:提供设备的挂载点, 媒体文件  
linux 新增了盘符, 需要手动挂载 , 把光盘里的数据, 挂载到media目录  
mount  /dev/cdrom /media/  
mnt:提供设备的挂载点(同上) 
opt:第三方工具, 第三方软件默认安装的(mysql...)  
run :pid, log结尾的文件  
[root@kid ~]# ls /run 
auditd.pid sshd.pid ...

[root@kid ~]# cat /run/sshd.pid 
891
打开两个xshell连接虚拟机, 在使用yum安装软件的使用, 会产生一个yum.pid的文件
.pid文件是一个包含进程标识号(pid)的文件

2022-08-20_00910

两个用户连接一个终端, 且同时下载某一个软件时, 谁先获取到yum锁则先执行.

2022-08-20_00911

3. 文件路径定位

3.1 路径
路径: 整个文件中包含文件名称以及文件所在的位置, 路径是对文件进行定位的一种方式.

img

每个目录下都有一个...的目录
. 一个点代表当的是当前目录
.. 两个点代表的是当前目录的上层目录
3.3 绝对路径&相对路径呢
相对路径呢绝对路径:只要从/开始的路径, 比如/home/alice/file  
相对路径:相对于当前目录来说, 比如 a.txt ./a.txt  
# 所谓的(.)(..)目录实际上属于相对路径的一种表示形式.
3.4 切换路径
切换路径命令: cd [选项] [参数] 
# cd 绝对路径 
cd /etc/hostname

# cd 相对路径 
cd test/abc 
cd . 
cd ..  


# cd .        # 代表当前目录 
# cd ..       # 切换回当前目录的上级目录 
# cd -        # 切换回上一次所在的目录  
# cd (回车)   # 等同于cd ~ 
# cd ~        # 切换回当前用户的家目录, 注意:root和普通用户的家目录不同 
                root的家目录是 /root
                普通用户的家目录是 /home/用户名

4. 系统文件管理

4.1 创建文件
# 无则创建,有则修改创建时间 
[root@kid ~]# touch file                     

# 一次创建多个文件
[root@kid ~]# touch file2 file3  

# 指定目录创建文件
[root@kid ~]# touch /home/od/file4 file5  

# 批量创建文件
[root@kid ~]# touch file{a,b,c}            

[root@kid ~]# touch file{1..10}  

[root@kid ~]# touch file{a..z}  
4.2 创建目录
命令: mkdir [选项] [参数]
选项:-v 显示详细信息  -p 递归创建目录  
# 创建目录
[root@kid ~]#  mkdir dir1  

# 指定位置创建目录
[root@kid ~]#  mkdir /root/dir1 /root/dir2  

# 创建多个目录并展现详情
[root@kid ~]#  mkdir -v /root/{dir3,dir4}  

# 递归创建目录并展现详情
[root@kid ~]#  mkdir -pv /root/dir5/dir6  

# 在root目录下创建a, b, 在a目录下创建1, 2
[root@kid ~]# mkdir -pv /root/{a/{1,2},b}  
4.3 目录结构
以树状显示目录结构命令: tree [选项] [参数]
需要安装tree: yum install tree -y
[root@kid ~]#  tree 
.
├── a
│   ├── 1
│   └── 2
├── anaconda-ks.cfg
├── b
├── file
├── test.txt
└── touch

4 directories, 4 files
4.4 复制文件
命令: cp [选项] [参数]
选项:
    -v:详细显示命令执行的操作 
    -r:递归处理目录与子目录 
    -p:保留源文件或目录的属性  
    
cp 文件 /路径/name         # 修改名称复制
cp 文件 /路径/             # 不修改名称复制  
# 将文件存放到临时存放目录tmp下
[root@kid ~]# ls
anaconda-ks.cfg  file
[root@kid ~]# cp file /tmp/file_copy
[root@kid ~]# ls /tmp/file_copy
/tmp/file_copy
# 文件在复制之后属性可能会发生变化, 使用-p选项保持原文件的属性  
[root@kid ~]# cp -p file /tmp/file_copy2
# 复制目录需要使用-r参数, 递归复制  
[root@kid ~]# mkdir  a
[root@kid ~]# ls
a  ...
[root@kid ~]# cp -r a /tmp/
[root@kid ~]# ls /tmp/
a  ...
# 拷贝多个文件或目录至一个目录  
[root@kid ~]# mkdir  目录1 目录2
[root@kid ~]# ls
目录1  目录2 ...
[root@kid ~]# cp -rv 目录1 目录2 /tmp
‘目录1’ -> ‘/tmp/目录1’
‘目录2’ -> ‘/tmp/目录2’
# 移动文件并修改名称
cp -rv /etc/{hosts,hosts.bak}  
[root@kid ~]# cp -rv /etc/{hosts,hosts.bak}  
‘/etc/hosts’ -> ‘/etc/hosts.bak’

# 移动文件并修改名称
cp -rv /etc/hosts{,-org}  
[root@kid ~]# cp -rv /etc/hosts{,-org}  
‘/etc/hosts’ -> ‘/etc/hosts-org’
4.4 移动文件
命令: mv [选项] [参数]
* 移动文件, 默认可以递归移动.
# 原地移动算改名 
[root@kid ~]# mv file file1      
# 移动文件至tmp目录  
[root@kid ~]# mv file1 /tmp/            
# 移动tmp目录的文件至当前目录
[root@kid ~]# mv /tmp/file1 ./           
# 移动目录至/tmp目录下  
[root@kid ~]# mv dir/ /tmp/             
# 移动多个文件或至同一个目录  
[root@kid ~]# touch file{1..3}  
[root@kid ~]# mv file1 file2 file3 /tmp/    
# 移动多个目录至同一个目录             
[root@kid ~]# mkdir dir{1..3}  
[root@kid ~]# mv dir1/ dir2/ dir3/ /tmp      
4.6 删除文件
命令: mv [选项] [参数]
选项:
    -r:递归
    -f:强制删除
    -v:详细过程  
# 删除文件, rm存在alias别名, rm -i所以会提醒是否删除文件 
[root@kid ~]# rm file 
rm: remove regular empty file ‘file’? (光标在则, 回复y回车即删除)
# 删除文件, 不提醒  
[root@kid ~]#  rm -f 1.txt    
# 递归删除目录, 会提示
[root@kid ~]# rm -r 目录1
rm: remove directory ‘目录1’? y
# 强制删除目录, 不提醒(慎用)  
[root@kid ~]# rm -rf 目录2
[root@kid ~]# mkdir dir1
[root@kid ~]# touch dir1/file{1..10}.txt
[root@kid ~]# touch dir1/.file
[root@kid ~]# ls -a dir1
.      file10.txt  file3.txt  file6.txt  file9.txt
..     file1.txt   file4.txt  file7.txt
.file  file2.txt   file5.txt  file8.txt
# 删除有前后缀的文件
[root@kid ~]# rm -rf dir1/*.*
[root@kid ~]# ls -a dir1
.  ..  .file
# 删除示例2  
[root@kid ~]# mkdir dir2
[root@kid ~]# touch dir2/file{1..10}  
[root@kid ~]# touch dir2/{1..10}.pdf  
[root@kid ~]# ls dir2
10.pdf  3.pdf  6.pdf  9.pdf   file2  file5  file8
1.pdf   4.pdf  7.pdf  file1   file3  file6  file9
2.pdf   5.pdf  8.pdf  file10  file4  file7

[root@kid ~]# rm -rf dir2/file*
[root@kid ~]# ls dir2
10.pdf  2.pdf  4.pdf  6.pdf  8.pdf
1.pdf   3.pdf  5.pdf  7.pdf  9.pdf

[root@kid ~]# rm -rf dir2/*.pdf
[root@kid ~]# ls dir2

5. 查看文件内容

查看文件内容(cat tac less more head tail tailf grep )
5.1 cat
查看文本命令: cat  [选项] [参数]
选项:
	-n 显示行号
	-A 查看文件的特殊符号
# 将文件复制到当前目录中
[root@kid ~]# cp /etc/passwd ./pass  
# 查看文件内容
[root@kid ~]# cat ./pass   
...
# 默认无行号
[root@kid ~]# cat  pass  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
# 显示行号
[root@kid ~]# cat -n pass
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     ...
# 查看文件的特殊符号, $为结束符 
[root@kid ~]# cat -A pass   
root:x:0:0:root:/root:/bin/bash$
bin:x:1:1:bin:/bin:/sbin/nologin$
cat创建文件: cat >> 文件名 << 结束字符
[root@kid ~]# cat >> txt1.txt <<EOF  
> 123 (回车,到下一行)
> 456 (回车,到下一行)
> EOF (输入结束字符串, 停止输入)
[root@kid ~]# cat txt1.txt 
123
456
5.2 tac
tac:  倒序查看文件  
[root@kid ~]# tac pass 
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
...
5.3 less
less  上下翻动, 空格进行翻页, q退出
[root@kid ~]# mv /etc/services ./
[root@kid ~]# less services  
...
5.4 more
more  使用回车上下翻动, 空格进行翻页, q退出(有百分比) 
[root@kid ~]# cp /etc/services ./
[root@kid ~]# more services  
...
5.5 head
查看文本头部内容命令(默认前十行): head  [选项] [参数]
选项:
	-n行数 查看头部n行, 使用-n指定
[root@kid ~]# head -n5 pass
root:x:0:0:root:/root:/bin/bash
...

# 只看头部5个进程  
ps aux | head -5
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.6 128004  6600 ?        Ss   Aug25   0:01  ...
...
5.6 tail
查看文本尾部内容命令(默认前十行): head  [选项] [参数]
选项:
	-序号 查看文件尾部n行  
	-f    动态查看文件尾部的变化
	
查看文件尾部的变化命令: tailf 等同于tail -f -n 10
# 查看文件尾部10行 
[root@kid ~]# tail pass
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
...
 # 查看文件尾部20行 
[root@kid ~]# tail -20 /var/log/secure  
Aug 25 23:08:27 kid sshd[919]: Received signal 15; terminating.
...
# 动态查看文件尾部的变化 
[root@kid ~]# tail -f /var/log/messages
Aug 25 23:21:16 kid systemd: Removed slice User Slice of root.
...
# 动态查看文件尾部的变化 
[root@kid ~]# tailf /var/log/messages
Aug 25 23:21:18 kid systemd: Created slice User Slice of root.
...
# 查看倒数两个进程
[root@kid ~]# ps -aux | tail -2 
root       1484  0.0  0.1 155448  1852 pts/0    R+   04:04   0:00 ps aux
root       1485  0.0  0.0 108088   676 pts/0    S+   04:04   0:00 tail -2
5.7 grep
过滤文件内容命令: grep  [选项] [正则表达式] [参数]
选项:
	-i 忽略大小写匹配
	-n 显示行号
	-A 行数 展示上n行
	-B 行数 展示上下n行
	-C 行数 展示下n行
	-E 选项可以用来扩展选项为正则表达式,
	   则应该使用 | 来分割多个pattern,以此实现OR操作。
# 匹配以root开头的行 
[root@kid ~]#  grep "^root" pass
root:x:0:0:root:/root:/bin/bash
# 匹配以bash结尾的行
[root@kid ~]#  grep "bash$" pass 
root:x:0:0:root:/root:/bin/bash
# 忽略大小写匹配  
[root@kid ~]#  grep -i "ftp" pass    
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
 # 匹配文件中包含sync结尾或ftp字符串
[root@kid ~]#  grep  -Ei "sync$|ftp" pass  
sync:x:5:0:sync:/sbin:/bin/sync
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
# 打印匹配字符串所在行加它下2行  
[root@kid ~]# grep -n -A 2 "nobody" pass
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14-systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15-dbus:x:81:81:System message bus:/:/sbin/nologin
# 打印匹配字符串所在行加它上2行 
[root@kid ~]# grep -n -B 2 "nobody" pass
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
# 打印匹配字符串所在行加它上下2行 
[root@kid ~]# grep -n -C 2 "nobody" pass
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14-systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15-dbus:x:81:81:System message bus:/:/sbin/nologin

6. 文件的上传下载

6.1联网下载
联网下载文件(wget、curl)
联网下载文件命令: wget [选项] [参数]
wget下载: yum install wget -y  
选项:
	-O 指定下载地址 
[root@kid ~]# yum install wget -y 
...
# 下载阿里云yum源 保存到指定地址
[root@kid ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo  
浏览网络上资源命令: curl [选项] [参数]
选项:
	-o保存到本地  
[root@kid ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo  
6.2 文件传输
文件上传与下载(rz、sz)
lrzsz下载: yum install lrzsz -y 
rz 能上传文件文件上传(不能大于4g)
[root@kid ~]# rz 选择本地文件

image-20220826210859834

sz 只能下载文件
[root@kid ~]# sz 文件名 选择本地路径地址

image-20220826210716964

7. 查找类命令

7.1 文件查找
文件查找命令: locate [选项] [参数]
locate下载: yum  -y install mlocate

下载之后, 想要直接使用输入: sudo updatedb
否则会报错:
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory

选项: 
	-i 忽略大小写
# 搜索etc目录下所有以sh开头的文件
[root@kid ~]# locate /etc/sh       

# 搜索etc目录下, 所有以sh开头的文件, 忽略大小写  
[root@kid ~]# locate -i /etc/sh    
7.2 命令查找
查看存放命令的绝对路径: which [选项] [参数]
[root@kid ~]# which ls  
查找命令的路径、帮助手册命令: whereis [选项] [参数]
选项: 
	-b 仅显示命令所在的路径, 仅看二进制  
[root@kid ~]#  whereis ls  
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

[root@kid ~]# whereis -b ls
ls: /usr/bin/ls
(用which whereis 是无法查询到的, 需要使用type采查询)
内核相关信息命令: type [选项] [参数]
选项:
	-a 查看命令的绝对路径,包括别名.

8. 字符处理命令

8.1 sort排序
有些情况下, 需要对应一个无序的文本文件进行数据的排序, 这时就需要使用sort进行排序
sort [选项] [文件]
选项:
	-r:倒序 
	-n:按数字排序
    -t:指定分隔符(默认空格)
    -k:指定第几列, 指定几列几字符(指定1,1  3.1,3.3 
# 1.首先创建一个文件, 写入一写无序的内容  
[root@kid ~]# cat >> file.txt <<EOF  
b:3  
c:2  
a:4  
e:5  
d:1  
f:11  
EOF  
# 2.使用sort下面对输出的内容进行排序  
[root@kid ~]# sort file.txt  
a:4  
b:3  
c:2  
d:1  
e:5  
f:11  
# 结果并不是按照数字排序, 而是按字母排序
# -t 指定分隔符, -k指定列, 按第二列排序  
[root@kid ~]# sort -t ":" -k2 file.txt  
d:1  
f:11 # 第二行为什么是11?按照排序的方式, 
c:2  
b:3  
a:4  
e:5  
# 按照排序的方式只会看到第一个字符,11的第一个字符是1, 按照字符来排序确实比2小
# 如果想要按照数字的方式进行排序, 需要使用 -n参数, 按数字排序. 
[root@kid ~]# sort -t ":" -n -k2 file.txt  
d:1  
c:2  
b:3  
a:4  
e:5  
f:11  
8.2 uniq去重
如果文件中有多行完全相同的内容, 当前是希望能删除重复的行,
同时还可以统计出完全相同的行出现的总次数.
那么就可以使用`uniq`命令解决这个问题(但是必须配合`sort`使用, 相邻的才能去重)
uniq [选项]... [INPUT [OUTPUT]]  
选项:
	-c  计算重复的行  
# 1.创建一个file.txt文件: 
[root@kid ~]# cat >>file2.txt <<EOF  
abc  
123  
abc  
123  
EOF  
# 2.  先使用sort排序, 让重复内容连续在一起  
# | 管道符, 将cat查看的信息交给sort处理
[root@kid ~]# cat file.txt |sort  
123  
123  
abc  
abc
# 3.-c参数能统计出文件中每行内容重复的次数  
[root@kid ~]# cat file.txt |sort|uniq -c  
2 123  
2 abc 
# 4.使用uniq去除相邻重复的行  
[root@kid ~]# cat file.txt |sort|uniq  
123  
abc  
8.3 cut截取字段
cut [选项] [参数]
选项:
	-d 指定分隔符
    -f 数字,取第几列 –f3, 6  3列和6
    -c 按字符取(空格也算)  
[root@kid ~]# echo "Im kid, is QQ 1oo86" >file.txt     
# 过滤出文件里 kid以及1oo86
[root@kid ~]#  cut -d " " -f2,5 file.txt  
8.4 wc统计行号
wc [选项] [参数]
选项:
	-l显示文件行数
    -c显示文件字节
    -w显示文件单词
# 统计/etc/fstab文件有多少行
[root@kid ~]# wc -l /etc/fstab  
11 /etc/fstab 
# 统计/etc/services 文件行号  
[root@kid ~]# wc -l /etc/services 
# 统计当前路径下有多少文件和文件夹  
[root@kid ~]#  ls |wc -l  
3         

9. 系统文件属性

使用ls -l列目录下所有文件时, 通常会以长格式的方式显示, 
其实长格式显示就是Windows下看到的文件详细信息, 也将其称为文件属性, 整个文件的属性分为十列.
[root@kid ~]# ls -l anaconda-ks.cfg  
-rw-------. 1 root root 1263 Aug 26 19:24 anaconda-ks.cfg
-rw-------.        :第一个字符是文件类型, 其他则是权限  
1                  :硬链接次数  
root               :文件属于哪个用户  
root               :文件属于哪个组  
1263               :文件大小  
Aug 26 19:24       ⑥⑦⑧:最新修改的时间与日期  
anaconda-ks.cfg    :文件或目录名称  

10. 系统文件类型

通过ls -l以长格式显示一个文件的属性, 通过第一列的第一个字符来近一步的判断文件具体的类型.
PS:Linux文件扩展名不代表任何含义, 仅为了我们能更好的识别该文件是什么类型.
[root@kid ~]# ls -l anaconda-ks.cfg  
-rw-------. 1 root root 1263 Aug 26 19:24 anaconda-ks.cfg
[root@kid ~]# ll -d /etc/hosts /tmp /bin/ls  /dev/sda /dev/tty1 /etc/grub2.cfg /dev/log /run/dmeventd-client  
-rwxr-xr-x.  1 root root 117608 Aug 20  2019 /bin/ls
srw-rw-rw-.  1 root root      0 Aug 26 20:58 /dev/log
brw-rw----.  1 root disk   8, 0 Aug 26 20:58 /dev/sda
crw--w----.  1 root tty    4, 1 Aug 26 20:58 /dev/tty1
lrwxrwxrwx.  1 root root     22 Aug 26 19:18 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
-rw-r--r--.  1 root root    158 Jun  7  2013 /etc/hosts
prw-------.  1 root root      0 Aug 26 20:58 /run/dmeventd-client
drwxrwxrwt. 12 root root   4096 Aug 26 21:22 /tmp

-   普通文件(文本, 二进制, 压缩, 图片, 日志等)   
d   目录文件  
b   设备文件(块设备)存储设备硬盘 /dev/sda1, /dev/sda2  
c   设备文件(字符设备), 终端 /dev/tty1, /dev/zero  
s   套接字文件, 进程间通信(socket)  
p   管道文件  
l   链接文件  
无法通过ls -l文件的类型, 比如:一个文件, 它可能是普通文件、也可能是压缩文件、或者是命令文件等, 
那么此时就需要使用file来更加精准的判断这个文件的类型.
[root@kid ~]# file /etc/hosts  
/etc/hosts: ASCII text
# 文件路径 文件类型
[root@kid ~]# file /dev/sda  
/dev/sda:block special  

11. 系统链接文件

11.1 文件的组成
文件有文件名与数据, 在Linux上被分成两个部分:用户数据 (user data) 与元数据 (metadata).  

用户数据, 即文件数据块 (data block), 数据块是记录文件真实内容的地方, 将其称为Block 

元数据, 即文件的附加属性, 如文件大小、创建时间、所有者等信息, 称其为Inode (ll -i 查看inode)

在Linux中, inode是文件元数据的一部分但其并不包含文件名, inode号即索引节点号)  
文件名仅是为了方便人们的记忆和使用, 系统或程序通过 inode 号寻找正确的文件数据块.
下图展示了程序通过文件名获取文件内容的过程.  

img

Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,  soft link  symbolic link)
11.2 软链接
软链接相当于Windows的快捷方式, 软链接文件会将inode指向源文件的block, 
访问软链接文件时, 其实访问的是源文件本身.

那么当我们对一个文件创建多个软链接, 其实就是多个inode指向同一个block.
删除软链接文件时, 其实只是删除了一个inode指向, 并不会对源文件源文件造成影响, 
但如果删除的是源文件则会造成所有软链接文件失效.

img

11.3 软链接实践
# 文件软链接示例  
touch 1.txt  
ln -s 1.txt  /tmp/1_lns.txt  
ll /tmp/1_lns.txt   
# root下 1.txt链接到/tmp下并重命名为1_lns.txt  
# 目录软链接示例  
[root@kid ~]# mkdir /dir/a -p  
[root@kid ~]# ln -s /dir/ /tmp/  
[root@kid ~]# ll /tmp/dir   
lrwxrwxrwx. 1 root root 5 Aug 26 21:46 /tmp/dir -> /dir/
# 查看链接指向  
# 使用场景  
1.软件升级  
	第一次安装软件xxx0.1版本 --建立软件链接--> xxx
	将软件链接添加到环境变量中
	第二次软件升级xxx0.2版本 --建立软件链接--> xxx
	便可以直接使用, 软件升级失败还原成第一版本的软件接即可.
	(在升级到新版时, 让新版本软件的软链接名与旧软件的软件连接重名即可)
2.企业代码发布   
3.不方便目录移动  
11.4 硬链接
若一个inode号对应多个文件名, 则称这些文件为硬链接.
换言之, 硬链接就是同一个文件使用了多个别名, 如下图hard link 就是 file
的一个别名, 他们有共同的 inode.  

img

# 文件硬链接示例 

ln  /root/file /tmp/file_hard  
ll /tmp/file_hard  
 
# PS:目录不能创建硬链接, 硬链接文件可以用rm命令删除  
11.5 硬链接与软链接区别
1. ln命令创建硬链接, ln -s命令创建软链接. 
2. 目录不能创建硬链接, 并且硬链接不可以跨越分区系统. 
3. 目录软链接特别常用,并且软链接支持跨越分区系统. 
4. 硬链接文件与源文件的inode相同, 软链接文件与源文件inode不同. 
5. 删除软链接文件, 对源文件及硬链接文件无任何影响. 
6. 删除文件的硬链接文件, 对源文件及链接文件无任何影响. 
7. 删除链接文件的源文件, 对硬链接无影响, 会导致软链接失效. 
8. 删除源文件及其硬链接文件, 整个文件会被真正的删除.

————————————————
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
————————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值