# 1. 文件管理概述
1.Bash Shell 对文件进行管理 谈到 Linux 文件管理,首先我们需要了解的就是,我们要对文件做些什么事情? 其实无非就是对一个文件进行、创建、复制、移动、查看、编辑、压缩、查找、删除、等等 例如:当我们想修改系统的主机名称,是否应该知道文件在哪,才能去做对应的修改? 2. 内容摘要 系统目录结构 文件路径定位 文件管理命令 文件类型 file 链接文件 ln 文件编辑 vim
# 2. 系统目录结构
几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件,而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树的分支,所以该结构又被称为 “目录树”。 Windows: 以多根的方式组织文件 C:\ D:\ Linux: 以单根的方式组织文件 / 如下图为 Centos7 的目录结构
1. 存放命令相关的目录 /bin, 普通用户使用的命令 /bin/ls, /bin/date/sbin,管理员使用的命令 /sbin/service
2. 存放用户相关数据的家目录,比如:windows 不同的用户登陆系统显示的桌面背景不一样 /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
4. 启动目录 /boot 存放的系统启动相关的文件,例如:kernel,grub (引导装载程序)
5. 配置文件目录 /etc,极其重要,后续所有服务的配置都在这个目录中 /etc/sysconfig/network-script/ifcfg-,网络配置文件 /etc/hostname,系统主机名配置文件 /etc/resolv.conf,dns 客户端配置文件 /etc/hosts,本地域名解析配置文件 6. 可变的目录与临时目录 /var,存放一些变化文件,比如 /var/log/ 下的日志文件 /var/tmp,进程产生的临时文件 /tmp,系统临时目录 (类似于公共厕所) 7. 设备目录文件 /dev,存放设备文件,比如硬盘,硬盘分区,光驱,等等 /dev/null,黑洞设备,只进不出。类似于垃圾回收站 /dev/random,生成随机数的设备 /dev/zero,能远远不断的产生数据,类似于取款机,随时随地取钱
8. 虚拟的文件系统 (如对应的进程停止则 /proc 下对应目录则会被删除) /proc,反映系统当前进程的实时状态 PS:类似于小汽车的仪表板,能够看到汽车是否有故障,或者是否缺油了。 9.PS: 在 Linux7 系统中,/bin, /sbin, /lib, /lib64 都以软链接的形式链接到 /usr/ 目录下 /bin --> /usr/bin/sbin --> /usr/sbin lib -> usr/lib lib64 -> usr/lib64
# 3. 文件路径定位
在我们开始操作文件前,首先需要对文件进行定位,比如:你要在哪创建什么文件?你要将文件复制到什么地方?或者你要删除的文件在什么地方?那什么是定位:比如 /etc/hostname,整个文件中包含文件名称以及文件所在的位置,我们将这个叫做路径,那么路径就是对文件进行定位的一种方式。例:如下图的 message 所在的路径是?
提问 FQ: /home/oldboy/file 和 /home/oldgirl/file 是否是同一个文件? 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 .. #切换回当前目录的上级目录 |
# 4. 系统文件管理
1. 文件管理之:创建 / 复制 / 移动 / 删除 ---------------------------------------- 创建 ---------------------------------------- 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} |
2. 目录创建命令 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} |
3. 以树状显示目录结构命令 tree
# 选项: -L: 显示目录树的层级 | |
# tree /home/od/ #显示当前目录下的结构 | |
/home/od/ | |
├── but | |
├── dir1 | |
├── dir2 | |
├── dir3 | |
├── dir4 | |
├── dir5 | |
│ └── dir6 | |
└── diu |
----------------------------------------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 #倒序查看文件 | |
#------less、more | |
# less /etc/services #使用光标上下翻动,空格进行翻页,q 退出 | |
# more /etc/services #使用回车上下翻动,空格进行翻页,q 退出 | |
#------head | |
# head pass #查看头部内容,默认前十行 | |
# head -n5 pass #查看头部 5 行,使用 - n 指定 | |
#------tail | |
# tail pass | |
# tail -20 /var/log/secure | |
# tail -f /var/log/messages #-f 查看文件尾部的变化 | |
# tailf /var/log/messages #查看文件尾部的变化 | |
#------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、curl 联网下载文件 ----------------------------------------
#选项: -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 |
----------------------------------------rzsz 上传下载文件 ----------------------------------------
# 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 进行排序了。
sort [OPTION]... [FILE]... | |
# -r:倒序 -n:按数字排序 -t:指定分隔符 (默认空格) -k:指定第几列,指定几列几字符(指定 1,1 3.1,3.3) | |
#1. 首先创建一个文件,写入一写无序的内容 | |
[root@xuliangwei ~]# cat >> file.txt <<EOF | |
b:3 | |
c:2 | |
a:4 | |
e:5 | |
d:1 | |
f:11 | |
EOF | |
#2. 使用 sort 下面对输出的内容进行排序 | |
[root@xuliangwei ~]# sort file.txt | |
a:4 | |
b:3 | |
c:2 | |
d:1 | |
e:5 | |
f:11 | |
#结果并不是按照数字排序,而是按字母排序。 | |
#可以使用 - t 指定分隔符,使用 - k 指定需要排序的列。 | |
[root@xuliangwei ~]# sort -t ":" -k2 sort.txt | |
d:1 | |
f:11 #第二行为什么是 11?不应该按照顺序排列? | |
c:2 | |
b:3 | |
a:4 | |
e:5 | |
#按照排序的方式,只会看到第一个字符,11 的第一个字符是 1, 按照字符来排序确实比 2 小。 | |
#如果想要按照数字的方式进行排序,需要使用 -n 参数。 | |
[root@xuliangwei ~]# 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@xuliangwei ~]# sort -t. -k3.1,3.1nr -k4.1,4.3nr ip.txt |
----------------------------------------uniq 去重 ---------------------------------------- 如果文件中有多行完全相同的内容,当前是希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数,那么就可以使用 uniq 命令解决这个问题 (但是必须配合 sort 使用)。
uniq [OPTION]... [INPUT [OUTPUT]] | |
#选项:-c 计算重复的行 | |
#1. 创建一个 file.txt 文件: | |
[root@xuliangwei ~]# cat file.txt | |
abc | |
123 | |
abc | |
123 | |
#2.uniq 需要和 sort 一起使用,先使用 sort 排序,让重复内容连续在一起 | |
[root@xuliangwei ~]# cat file.txt sort | |
123 | |
123 | |
abc | |
abc | |
#3. 使用 uniq 去除相邻重复的行 | |
[root@xuliangwei ~]# cat file.txt sortuniq | |
123 | |
abc | |
#4.-c 参数能统计出文件中每行内容重复的次数 | |
[root@xuliangwei ~]# cat file.txt sortuniq -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.xuliangwei.com/index.html | |
http://www.xuliangwei.com/1.html | |
http://post.xuliangwei.com/index.html | |
http://mp3.xuliangwei.com/index.html | |
http://www.xuliangwei.com/3.html | |
http://post.xuliangwei.com/2.html | |
# awk -F '/' '{print $3}' web.logsort -rnuniq –c | |
# cut -d / -f3 web.logsort -rnuniq –c |
# 5. 系统文件属性
当我们使用 ls -l 列目录下所有文件时,通常会以长格式的方式显示,其实长格式显示就是我们 Windows 下看到的文件详细信息,我们也将其称为文件属性,那整个文件的属性分为十列。
[root@xuliangwei ~]# 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 ⑨:文件或目录名称
# 5. 系统文件类型
1. 通常我们使用颜色或者后缀名称来区分文件类型,但很多时候不是很准确,所以我们可以通过 ls -l 以长格式显示一个文件的属性,通过第一列的第一个字符来近一步的判断文件具体的类型。
[root@xuliangwei ~]# 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@xuliangwei ~]# file /etc/hosts
/etc/hosts: ASCII text
[root@xuliangwei ~]# 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@xuliangwei ~]# file /dev/sda
/dev/sda: block special
[root@xuliangwei ~]# file /dev/tty1
/dev/tty1: character special
[root@xuliangwei ~]# file /etc/grub2.cfg
/etc/grub2.cfg: broken symbolic link to `../boot/grub2/grub.cfg'
[root@xuliangwei ~]# file /home
/home: directory
[root@xuliangwei ~]# file /run/dmeventd-client
/run/dmeventd-client: fifo (named pipe)
[root@xuliangwei ~]# ll but
-rw-r--r-- 1 root root 42125 Apr 1 12:26 but
[root@xuliangwei ~]# file but
but: Zip archive data, at least v1.0 to extract
PS: Linux 文件扩展名不代表任何含义,仅为了我们能更好的识别该文件是什么类型。
# 6. 系统链接文件
文件有文件名与数据,在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。 用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方,我们将其称为 Block 元数据,即文件的附加属性,如文件大小、创建时间、所有者等信息。我们称其为 Inode 在 Linux 中,inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号) 文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。图 1. 展示了程序通过文件名获取文件内容的过程。
Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link) 1. 什么是软链接 软链接相当于 Windows 的快捷方式,软链接文件会将 inode 指向源文件的 block,当我们访问这个软链接文件时,其实访问的是源文件本身。那么当我们对一个文件创建多个软链接,其实就是多个 inode 指向同一个 block。当我们删除软链接文件时,其实只是删除了一个 inode 指向,并不会对源文件源文件造成影响,但如果删除的是源文件则会造成所有软链接文件失效。
2. 什么是硬链接 若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名,如下图 hard link 就是 file 的一个别名,他们有共同的 inode。
3. 软链接实践
#文件软链接示例 | |
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.不方便目录移动 |
4. 硬链接实践
#文件硬链接示例 | |
ln /root/file /tmp/file_hard | |
ll /tmp/file_hard | |
#PS:目录不能创建硬链接,硬链接文件可以用 rm 命令删除 |
5. 硬链接与软链接区别 1) ln 命令创建硬链接,ln -s 命令创建软链接。 2) 目录不能创建硬链接,并且硬链接不可以跨越分区系统。 3) 目录软链接特别常用,并且软链接支持跨越分区系统。 4) 硬链接文件与源文件的 inode 相同,软链接文件与源文件 inode 不同。 5) 删除软链接文件,对源文件及硬链接文件无任何影响。 6) 删除文件的硬链接文件,对源文件及链接文件无任何影响。 7) 删除链接文件的源文件,对硬链接无影响,会导致软链接失效。 8) 删除源文件及其硬链接文件,整个文件会被真正的删除。
