一、Linux系统目录结构
Linux:以单根的方式组织文件,如图:
1.存放命令相关的目录
/bin, 普通用户使用的命令 /bin/ls, /bin/date
/sbin,管理员使用的命令 /sbin/service,poweroff,useradd…
2.存放用户相关数据的家目录
/home,普通用户的家目录, 默认为/home/username
/root,超级管理员root的家目录, 普通用户无权操作
3.系统文件目录
/usr,相当于C:Windows /usr/local,软件安装的目录,相当于C:Program /usr/bin/,普通用户使用的应用程序(重要) /usr/sbin,管理员使用的应用程序(重要) /usr/lib,库文件Glibc 32bit /usr/lib64,库文件Glibc 64bit
# 1 df -h #df -h查看系统中文件的使用情况 Size 分割区总容量 Used 已使用的大小 Avail 剩下的大小 Use% 使用的百分比 Mounted on 路径地址
# 2 du -sh * 查看当前目录下各个文件及目录占用空间大小 du -sh /usr/
# 3 标准是实现自动化的基础 不通主机的相同的软件,都放在相同路径下,便于管理,实现自动化 现在一般安装的软件,不放在/usr/local下了 # 4 总共有一千来个命令 ls /usr/bin/ | wc -l ls /usr/sbin/ | wc -l # 5 查看命令依赖那些库文件 ldd /bin/ls
4.启动目录
/boot 存放的系统启动相关的文件,例如:kernel,grub(引导装载程序)
ls /boot # linux内核 # 启动机器时可以选择的启动模式
5.配置文件目录
/etc,极其重要,后续所有服务的配置都在这个目录中 /etc/sysconfig/network-script/ifcfg-,网络配置文件 /etc/hostname,系统主机名配置文件,主机名很重要,有些特殊服务要依赖主机名,没有主机名会报错起不来;修改了要重启:reboot /etc/resolv.conf,dns客户端配置文件,域名解析服务器,一般我们不配置,因为网卡的配置好了,会覆盖掉它,网卡的优先级高 /etc/hosts,本地域名解析配置文件,域名解析,先找自己的hosts,再去域名解析 # 1 /etc/hosts 对应windows C:windows/system32/drivers/etc/hosts,黑客钓鱼网站 # 2 测试修改 yum install httpd -y systemctl stop firewalld echo "qjk NB" >/var/www/html/index.html systemctl start httpd
6.可变的目录与临时目录
/var,存放一些变化文件,比如/var/log/下的日志文件,登陆日志 /var/tmp,进程产生的临时文件 /tmp,系统临时目录(类似于公共厕所),谁都可以使用 # 1 查看登陆日志 cat /var/log/secure #查看登陆时间 # 2 进程产生的临时文件(360清理垃圾,就是会清理)
7.设备目录文件
/dev,存放设备文件,比如硬盘,硬盘分区,光驱,等等 /dev/sd 硬盘设备 /dev/null,黑洞设备,只进不出。类似于垃圾回收站 /dev/random,生成随机数的设备 /dev/zero,能源源不断的产生数据,类似于取款机,随时随地取钱 # 1 sda sdb sdc sda1 sdb4 linux中磁盘文件叫sd,第一个硬盘叫a,第二个叫b,sda1表示第一个磁盘的第一个分区,sdb4:第二个硬盘的第四个分区(服务可以插很多硬盘) # 2 /dev/null ls >/dev/null # 3 /dev/random 生成随机数 echo $RANDOM echo lqz_$RANDOM 批量创建随机用户,批量设置密码 # 4 源源不断取数据 dd if=/dev/zero of=/opt/test.txt bs=1M count=1024 ''' dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。 if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file > of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file > bs=bytes:同时设置读入/输出的块大小为bytes个字节。 count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。 ''' ll /opt/test.txt ll -h /opt/test.txt
8.虚拟的文件系统(如对应的进程停止则/proc下对应目录则会被删除)
/proc,反映系统当前进程的实时状态 :process PS:类似于小汽车的仪表板,能够看到汽车是否有故障,或者是否缺油了。 ls /proc # 可以看到很多id号,pid号,进程号,唯一 ls 进程id号的文件夹 如果进程被关闭,id号的文件夹就没了 id号每次启动都不唯一,只有一个进程唯一,systemd 是进程号1的进程,所有进程都是基于它派生出来的
9 其他
#1 media:提供设备的挂载点,媒体文件 # linux 新增了盘符,需要手动挂载 # 把光盘里的数据,挂载到media目录 mount /dev/cdrom /media/ # 2 mnt:提供设备的挂载点(同上) # 3 opt:第三方工具,第三方软件默认安装的(mysql...) # run :下有pid,log结尾的文件 ls /run cat sshd.pid # 进程运行的pid号,放在文件中 ps aux |grep sshd # .lock文件的作用,锁机制 # 假设现在执行 yum install tree # 再开一个窗口执行相同命令 yum install tree ''' Another app is currently holding the yum lock; waiting for it to exit... The other application is: yum Memory : 71 M RSS (470 MB VSZ) Started: Tue Aug 18 00:26:31 2020 - 00:24 ago State : Sleeping, pid: 6191 ''' cat /run/yum.pid
10. 在Linux7系统中
/bin, /sbin, /lib, /lib64都以软链接的形式链接到/usr/目录下 /bin –> /usr/bin /sbin –> /usr/sbin lib -> usr/lib lib64 -> usr/lib64
二、文件路径定位
1.每个目录下都有一个.和..的目录是什么?
一个点代表当的是当前目录, 两个点代表的是当前目录的上层目录。
假设当前目录在/usr/下, 那么它的上层(/)目录用../表示, 而/usr/的下层(local)目录则用./local表示。
2.那什么是绝对路径,什么又是相对路径呢?
绝对路径: 只要从/开始的路径,比如/home/alice/file 相对路径: 相对于当前目录来说,比如 a.txt ./a.txt ../bob/a.mp3 [加入: 此时在目录/home/alice] 小结: 所谓的(.)和(..)目录实际上属于相对路径的一种表示形式。
3.绝对路径与相对路径示例
#绝对路径 [root@bgx /]# useradd alice [root@bgx /]# touch /home/alice/file1 [root@bgx /]# touch ~/file2 [root@bgx /]# touch ~alice/file3 #相对路径 [root@bgx /]# mkdir abc [root@bgx /]# touch ../file3 [root@bgx /]# touch file4 [root@bgx /]# touch abc/file5
cd改变目录,常见的使用方法
# cd 绝对路径 cd /etc/hostname # cd 相对路径 cd test/abc cd . cd .. # cd #切换目录,例: cd /etc # cd - #切换回上一次所在的目录 # cd ~ #切换回当前用户的家目录,注意:root和普通用户是否有所不同吗? # cd . #代表当前目录,一般在拷贝、移动等情况下使用 cp /etc/hostname ./ # cd .. #切换回当前目录的上级目录
三、系统文件管理
1.文件管理之: 创建/复制/移动/删除
文件创建命令touch
# touch file #无则创建,有则修改时间 # touch file2 file3 # touch /home/od/file4 file5 # touch file{a,b,c} #{}集合,等价 touch a b c # touch file{1..10} # touch file{a..z}
目录创建命令mkdir
# 选项:-v 显示详细信息 -p 递归创建目录 # mkdir dir1 # mkdir /home/od/dir1 /home/od/dir2 # mkdir -v /home/od/{dir3,dir4} # mkdir -pv /home/od/dir5/dir6 # mkdir -pv /home/{od/{diu,but},boy}
cp复制
#选项: -v:详细显示命令执行的操作 -r: 递归处理目录与子目录 -p: 保留源文件或目录的属性 # cp file /tmp/file_copy # cp name /tmp/name #不修改名称 # cp file /tmp/ #不修改名称 # cp -p file /tmp/file_p #-p保持原文件或目录的属性 # cp -r /etc/ /tmp/ #复制目录需要使用-r参数, 递归复制 # cp -rv /etc/hosts /etc/hostname /tmp #拷贝多个文件至一个目录 # cp -rv /etc/{hosts,hosts.bak} # cp -rv /etc/hosts{,-org}
mv移动
# mv file file1 #原地移动算改名 # mv file1 /tmp/ #移动文件至tmp目录 # mv /tmp/file1 ./ #移动tmp目录的文件至当前目录 # mv dir/ /tmp/ #移动目录至/tmp目录下 # touch file{1..3} # mv file1 file2 file3 /opt/ #移动多个文件或至同一个目录 # mkdir dir{1..3} # mv dir1/ dir2/ dir3/ /opt #移动多个目录至同一个目录
rm删除
#选项:-r: 递归 -f: 强制删除 -v: 详细过程 # rm file.txt #删除文件, 默认rm存在alias别名,rm -i所以会提醒是否删除文件 # rm -f file.txt #删除文件, 不提醒 # rm -r dir/ #递归删除目录,会提示 # rm -rf dir/ #强制删除目录,不提醒(慎用) #1.rm删除示例 # mkdir /home/dir10 # touch /home/dir10/{file2,file3,.file4} # rm -f /home/dir10/ //不包括隐藏文件 # ls /home/dir10/ -a . .. .file4 #2.rm删除示例2 # touch file{1..10} # touch {1..10}.pdf # rm -rf file # rm -rf .pdf
2.查看文件内容(cat tac less more head tail tailf grep …)
#------cat # cp /etc/passwd ./pass # cat pass #正常查看文件方式 # cat -n pass #-n显示文件有多少行 # cat -A pass #查看文件的特殊符号,比如文件中存在tab键 # tac pass #倒序查看文件 cat >> test2.txt <<EOF ads adf EOF #------less、more # less /etc/services #使用光标上下翻动,空格进行翻页,q退出 # more /etc/services #使用回车上下翻动,空格进行翻页,q退出(有百分比) #------head # head pass #查看头部内容,默认前十行 # head -n5 pass #查看头部5行,使用-n指定 # ps aux | head -5 # 只看头部5个进程 #------tail # tail pass # 查看文件尾部,默认10行 # tail -20 /var/log/secure # 查看文件尾部20行 # tail -f /var/log/messages #-f动态查看文件尾部的变化 # tailf /var/log/messages #查看文件尾部的变化 # ps aux | tail -2 #------grep过滤文件内容 # grep "^root" pass #匹配以root开头的行 # grep "bash$" pass #匹配以bash结尾的行 # grep -i "ftp" pass #忽略大小写匹配 # grep -Ei "sync$|ftp" pass #匹配文件中包含sync结尾或ftp字符串 # grep -n -A 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的下2行 # grep -n -B 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上2行 # grep -n -C 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上下2行
3.联网下载文件(wget、curl)、文件上传与下载(rz、sz)
# wget 路径 默认下载在当前路径 #选项: -O: 指定下载地址 # wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #选项: -o: 指定下载地址 # curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # django:127.0.0.1:8080端口,先在本地curl一下,看看能不能通,可能是防火墙,阿里云的安全组
# yum install lrzsz -y #不安装软件则无法执行该命令 # rz #只能上传文件文件上传 # sz /path/file #只能下载文件
4.文件或命令查找(locate、which、whereis、find)
# 文件查找 # locate /etc/sh #搜索etc目录下所有以sh开头的文件 # locate -i /etc/sh #搜索etc目录下,所有以sh开头的文件,忽略大小写 # 命令查找 # which ls #查找ls命令的绝对路径 # whereis ls //查找命令的路径、帮助手册、等 # whereis -b ls //仅显示命令所在的路径 # type -a ls #查看命令的绝对路径(包括别名)
5.字符处理命令(sort、uniq、cut、sed、awk、wc、)
在有些情况下,需要对应一个无序的文本文件进行数据的排序,这时就需要使用sort进行排序了。
sort [OPTION]... [FILE]... # -r:倒序 -n:按数字排序 -t:指定分隔符(默认空格) -k:指定第几列, 指定几列几字符(指定1,1 3.1,3.3) #1.首先创建一个文件,写入一写无序的内容 [root@qjk ~]# cat >> file.txt <<EOF b:3 c:2 a:4 e:5 d:1 f:11 EOF #2.使用sort下面对输出的内容进行排序 [root@qjk ~]# sort file.txt a:4 b:3 c:2 d:1 e:5 f:11 #结果并不是按照数字排序,而是按字母排序。 #可以使用-t指定分隔符, 使用-k指定需要排序的列。 [root@qjk ~]# sort -t ":" -k2 sort.txt d:1 f:11 #第二行为什么是11?不应该按照顺序排列? c:2 b:3 a:4 e:5 #按照排序的方式, 只会看到第一个字符,11的第一个字符是1, 按照字符来排序确实比2小。 #如果想要按照数字的方式进行排序, 需要使用 -n参数。 [root@qjk ~]# sort -t ":" -n -k2 p.txt d:1 c:2 b:3 a:4 e:5 f:11 #测试案例,下载文件http://fj.xuliangwei.com/public/ip.txt,对该文件进行排序 [root@qjk ~]# sort -t. -k3.1,3.1nr -k4.1,4.3nr ip.txt
如果文件中有多行完全相同的内容,当前是希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数, 那么就可以使用uniq
命令解决这个问题
(但是必须配合sort
使用)。
uniq [OPTION]... [INPUT [OUTPUT]] #选项:-c 计算重复的行 #1.创建一个file.txt文件: [root@qjk ~]# cat file.txt abc 123 abc 123 #2.uniq需要和sort一起使用, 先使用sort排序, 让重复内容连续在一起 [root@qjk ~]# cat file.txt |sort 123 123 abc abc #3.使用uniq去除相邻重复的行 [root@qjk ~]# cat file.txt |sort|uniq 123 abc #4.-c参数能统计出文件中每行内容重复的次数 [root@qjk ~]# cat file.txt |sort|uniq -c 2 123 2 abc
cut截取字段
cut OPTION... [FILE]... #选项:-d 指定分隔符 -f 数字,取第几列 –f3,6三列和6列 -c 按字符取(空格也算) #echo "Im xlw, is QQ 552408925" >file.txt #过滤出文件里 xlw以及552408925 #实现上述题目几种思路 # cut -d " " -f2,5 file.txt # cut -d " " -f2,5 file.txt |sed 's#,##g' # sed 's#,# #g' file.txt | awk -F " " '{print $2 " " $5}' # awk '{print $2,$5}' file.txt |awk -F ',' '{print $1,$2}' # awk -F "[, ]" '{print $2,$6}' file.txt # awk -F '[, ]+' '{print $2,$5}' file.txt
wc统计行号
wc [OPTION]... [FILE]... #选项:-l显示文件行数 -c显示文件字节 -w显示文件单词 # wc -l /etc/fstab #统计/etc/fstab文件有多少行 # wc -l /etc/services #统计/etc/services 文件行号 #扩展方法 # grep -n "." /etc/services | tail -1 # awk '{print NR $0}' /etc/services | tail -1 # cat -n /etc/services | tail -1
分析如下日志,统计每个域名被访问的次数。
[root@student tmp]# cat web.log http://www.lqz.com/index.html http://www.lqz.com/1.html http://post.lqz.com/index.html http://mp3.lqz.com/index.html http://www.lqz.com/3.html http://post.lqz.com/2.html # awk -F '/' '{print $3}' web.log|sort -rn|uniq –c # cut -d / -f3 web.log|sort -rn|uniq –c
6.文件属性,类型
当我们使用ls -l列目录下所有文件时,通常会以长格式的方式显示,其实长格式显示就是我们Windows下看到的文件详细信息,我们也将其称为文件属性,
那整个文件的属性分为十列。
[root@qjk ~]# ls -l ks.cfg -rw-------. 1 root root 4434 May 30 13:58 ks.cfg # -rw-------. ①:第一个字符是文件类型,其他则是权限 1 ②:硬链接次数 root ③:文件属于哪个用户 root ④:文件属于哪个组 4434 ⑤:文件大小 May30 13:58 ⑥⑦⑧:最新修改的时间与日期 ks.cfg ⑨:文件或目录名称
1.通常我们使用颜色或者后缀名称来区分文件类型,但很多时候不是很准确,所以我们可以通过ls -l以长格式显示一个文件的属性,通过第一列的第一
个字符来近一步的判断文件具体的类型。
[root@qjk ~]# 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 117656 Jun 30 2016 /bin/ls srw-rw-rw-. 1 root root 0 Jan 20 10:35 /dev/log brw-rw----. 1 root disk 8, 0 Jan 20 10:36 /dev/sda crw--w----. 1 root tty 4, 1 Jan 20 10:36 /dev/tty1 lrwxrwxrwx. 1 root root 22 Jan 13 11:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg -rw-r--r--. 1 root root 199 Jan 20 11:03 /etc/hosts prw-------. 1 root root 0 Jan 20 10:36 /run/dmeventd-client drwxrwxrwt. 61 root root 8192 Jan 21 13:01 /tmp #说明 - #普通文件(文本, 二进制, 压缩, 图片, 日志等) d #目录文件 b #设备文件(块设备)存储设备硬盘 /dev/sda1, /dev/sda2 c #设备文件(字符设备),终端 /dev/tty1, /dev/zero s #套接字文件, 进程间通信(socket) p #管道文件 l #链接文件
2.但有些情况下,我们无法通过ls -l文件的类型,比如: 一个文件,它可能是普通文件、也可能是压缩文件、或者是命令文件等,那么此时就需要使用file来
更加精准的判断这个文件的类型。
[root@qjk ~]# file /etc/hosts /etc/hosts: ASCII text [root@qjk ~]# file /bin/ls /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=aa7ff68f13de25936a098016243ce57c3c982e06, stripped [root@qjk ~]# file /dev/sda /dev/sda: block special [root@qjk ~]# file /dev/tty1 /dev/tty1: character special [root@qjk ~]# file /etc/grub2.cfg /etc/grub2.cfg: broken symbolic link to `../boot/grub2/grub.cfg' [root@qjk ~]# file /home /home: directory [root@qjk ~]# file /run/dmeventd-client /run/dmeventd-client: fifo (named pipe) [root@qjk ~]# ll but -rw-r--r-- 1 root root 42125 Apr 1 12:26 but [root@qjk ~]# file but but: Zip archive data, at least v1.0 to extract
7.系统链接文件
文件有文件名与数据,在Linux上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。
用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方,我们将其称为Block
元数据,即文件的附加属性,如文件大小、创建时间、所有者等信息。我们称其为Inode
在Linux中,inode是文件元数据的一部分但其并不包含文件名,inode号即索引节点号)
文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。图1.展示了程序通过文件名获取文件内容的过程。
1.什么是软链接
软链接相当于Windows的快捷方式,软链接文件会将inode指向源文件的block,当我们访问这个软链接文件时,其实访问的是源文件本身。
那么当我们对一个文件创建多个软链接,其实就是多个inode指向同一个block。当我们删除软链接文件时,其实只是删除了一个inode指向,
并不会对源文件源文件造成影响,但如果删除的是源文件则会造成所有软链接文件失效。
2.什么是硬链接
若一个inode号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名,如下图hard link 就是 file 的一个别名,他们有共同的 inode。
软连接实践
#文件软链接示例 touch /root/file ln -s /root/file /tmp/file_bak ll /tmp/file_bak //root下file链接到/tmp下并重命名为file_bak #目录软链接示例 mkdir /soft/nginx1.1 -p ln -s /soft/nginx1.1/ /soft/nginx ll /soft/nginx //查看链接指向 #软链接使用场景 1.软件升级 2.企业代码发布 3.不方便目录移动
硬链接实践
#文件硬链接示例 ln /root/file /tmp/file_hard ll /tmp/file_hard #PS:目录不能创建硬链接,硬链接文件可以用rm命令删除
硬链接与软链接区别
1)ln命令创建硬链接,ln -s命令创建软链接。 2)目录不能创建硬链接,并且硬链接不可以跨越分区系统。 3)目录软链接特别常用,并且软链接支持跨越分区系统。 4)硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。 5)删除软链接文件,对源文件及硬链接文件无任何影响。 6)删除文件的硬链接文件,对源文件及链接文件无任何影响。 7)删除链接文件的源文件,对硬链接无影响,会导致软链接失效。 8)删除源文件及其硬链接文件,整个文件会被真正的删除。