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
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的内核, 系统启动是默认选择)
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
* 6. 到windows电脑的 C:\Windows\System32\drivers\etc 目录下找打hosts文件
将hosts文件只读模式取消(需要获取管理员权限)
* 7. 使用编辑器打开文件, 在末尾添加以下配置
# 自定义DNS解析 (格式: ip 域名)
10.0.0.100 www.centos7.com
# 8. 打开cmd提示符窗口, 刷新dns
C:\Users\13600>ipconfig /flushdns
Windows IP 配置
已成功刷新 DNS 解析缓存。
* 9. windows浏览器中访问 www.centos7.com
经过hosts文件将www.centos7.com解析为10.0.0.100, 再访问.
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
# 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)的文件
两个用户连接一个终端, 且同时下载某一个软件时, 谁先获取到yum锁则先执行.
3. 文件路径定位
3.1 路径
路径: 整个文件中包含文件名称以及文件所在的位置, 路径是对文件进行定位的一种方式.
每个目录下都有一个.和..的目录
. 一个点代表当的是当前目录
.. 两个点代表的是当前目录的上层目录
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 选择本地文件
sz 只能下载文件
[root@kid ~]# sz 文件名 选择本地路径地址
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 号寻找正确的文件数据块.
下图展示了程序通过文件名获取文件内容的过程.
Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接, 即 soft link 或 symbolic link)
11.2 软链接
软链接相当于Windows的快捷方式, 软链接文件会将inode指向源文件的block,
访问软链接文件时, 其实访问的是源文件本身.
那么当我们对一个文件创建多个软链接, 其实就是多个inode指向同一个block.
删除软链接文件时, 其实只是删除了一个inode指向, 并不会对源文件源文件造成影响,
但如果删除的是源文件则会造成所有软链接文件失效.
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.
# 文件硬链接示例
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. 删除源文件及其硬链接文件, 整个文件会被真正的删除.
————————————————
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
————————————————