目录
文件系统
linux 目录结构?
根目录下的文件结构和文件系统有关,不同文件系统可能有不同的目录结构
常见文件系统:ext3,swap,vfat,iso9660,NFS
目录结构:
- /bin:存放系统命令的二进制执行文件(mv,ls 等)
- /boot:存放系统启动时使用的各种文件
- /dev:存放设备文件
- /etc:存放系统配置文件
- /etc/rc.d:存放系统启动时执行的各种脚本文件
- /etc/rc.d/init:存放系统初始化文件
- /home:存放普通用户的主目录
- /lib:存放系统命令的函数库
- /lost+found:存放系统异常产生错误的文件
- /media:挂载目录
- /misc:挂载目录
- /mnt:挂载目录
- /proc:存放系统内存的映射文件
- /root:超级用户的主目录
- /sbin:存放系统命令的二进制执行文件(fdisk,shutdown 等)
- /tmp:存放临时文件
- /usr:存放系统应用程序
- /usr/bin:存放系统用户使用的应用程序
- /usr/sbin:存放超级用户使用的比较高级的管理程序和系统守护程序
- /usr/src:存放内核源代码
- /srv:存放服务启动之后需要提取的数据
- /sys:存放系统硬件设备
- /var:存放系统执行过程中经常变化的文件
文件类型:
- 普通文件(-)
- 目录文件(d)
- 链接文件(l)
- 字符设备(c)
- 块设备(b)
- 套接字文件(s)
- 命名管道文件(p)
- 堆栈文件(f)
文件权限
- r:读权限
- w:写权限
- x:执行权限
# 注意,ll 命令需要root权限,普通用户使用 ls -l
[root@iZuf6f738vgbarr2licuswZ /]# ll
total 132
# 文件属性
lrwxrwxrwx 1 root root 7 Jul 11 2019 bin -> usr/bin
dr-xr-xr-x 5 root root 4096 Jul 11 2019 boot
drwxr-xr-x 5 root testgroup 4096 Aug 22 15:58 home
lrwxrwxrwx 1 root root 7 Jul 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Jul 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 16384 Jul 11 2019 lost+found
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
-rw-r--r-- 1 root root 25548 Apr 7 2017 mysql57.rpm
dr-xr-x--- 12 root root 4096 Aug 22 15:26 root
drwxr-xr-x 26 root root 740 Aug 20 12:53 run
lrwxrwxrwx 1 root root 8 Jul 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
# 省略了一些
lrwxrwxrwx
第一个字符代表文件类型(l 代表链接文件),后面三个一组,分别代表文件所有者(u)、文件所属组(g)、**其他用户(o)**的权限
权限的值: r=4,w=2,x=1
# 例如
# rwxr-xr-x
# 4+2+1 4+0+1 4+0+1
# 755
root testgroup
第一个 root 代表文件所有者,第二个 testgroup 代表文件所属组
文件指令
cd | 切换工作目录
# 没啥好说的
# 返回上一个工作目录
cd -
# 回到用户目录
cd ~
pwd | 显示当前工作目录
# 没啥好说的
ls | 显示文件或目录信息
# 查看当前目录下的文件
ls
# 查看当前目录下的文件,包括隐藏文件(以.开头的文件)
ls -a
# 查看当前目录下的文件,包括隐藏文件,以及文件的详细信息
ls -al
# 查看当前目录下的文件类型
ll
# 等价于
ls -l
# 查看当前目录的详细信息
ls -d
更多参数请使用
ls --help
查看
mkdir | 创建目录
# 创建目录
mkdir [选项] 目录名
# 创建多级目录
mkdir -p 目录名
# 如果路径上的目录不存在,则自动创建,不会报错
# 对新目录设置权限
mkdir -m 权限 目录名
# 例如
mkdir -m 777 test
rmdir | 删除空目录
rmdir 只能删除空目录,如果目录中有文件,则不能删除
# 删除空目录
rmdir [选项] 目录名
# 一次性删除多个空目录
rmdir [选项] 目录名1 目录名2 目录名3
cat | 查看文件内容
# 查看文件内容
cat 文件名
# 查看文件内容,同时显示行号
cat -n 文件名
# 查看文件内容,同时显示行号,空行不显示
cat -b 文件名
# 反向显示文件内容
tac 文件名
// test1.c
#include <stdio.h>
void main(){
printf("Hello World! test1");
}
cp | 复制文件或目录
cp 命令用于复制文件或目录 vim
# 复制文件
cp [选项] 源文件 目标文件
# 复制目录
cp [选项] 源目录 目标目录
# 复制多个文件到目录
cp [选项] 源文件1 源文件2 源文件3 目标目录
参数
-a
:相当于-dpR
,保留源文件的属性,递归复制目录,保留链接文件-d
:复制时保留链接文件-f
:强制复制,如果目标文件已存在,则覆盖(ubuntu 默认)-i
:交互式复制,如果目标文件已存在,则提示用户是否覆盖-l
:创建硬链接文件-p
:保留源文件的属性-r
:递归复制目录
mv | 移动文件或目录
选项:
-i
:交互式操作,如果目标文件已存在,则提示用户是否覆盖-f
:禁止交互操作。在 mv 操作要覆盖某己有的日标文件时不给任何指示,在指定此选项后,选项将不再起作用
# 移动文件(重命名)
mv [选项] 源文件 目标文件
# eg
mv test1.c test2.c
# 将test1.c移动到test2.c
# 如果test2.c已存在,则会覆盖test2.c
# 移动目录
mv [选项] 源目录 目标目录
# eg
mv test1 test2
# 将test1目录移动到test2目录
# 如果test2目录已存在,则会将test1目录移动到test2目录下
# 如果test2目录不存在,则会将test1目录重命名为test2
# 加不加/都可以
# 移动多个文件到目录
mv [选项] 源文件1 源文件2 源文件3 目标目录
rm | 删除文件或目录
选项:
-i
:交互式操作,如果目标文件已存在,则提示用户是否覆盖-f
:强制删除,如果目标文件已存在,则不提示用户,直接删除-r
:递归删除目录
# 删除文件
rm [选项] 文件名
# 删除目录
rm [选项] 目录名
# 删除多个文件或目录
rm [选项] 文件名1 文件名2 文件名3 目录名1 目录名2 目录名3
# 删除目录及其子目录
truraly2@truraly2-virtual-machine:~/test$ rm -ri test6copy/
rm: 是否进入目录 'test6copy/'? y
rm: 是否删除普通文件 'test6copy/test2.c'? y
rm: 是否进入目录 'test6copy/test4'? y
rm: 是否删除普通文件 'test6copy/test4/test1.c'? y
rm: 是否删除目录 'test6copy/test4'? y
rm: 是否删除目录 'test6copy/'? y
如果没有使用-r 选项,则 rm 不会删除目录
使用该命令时一旦文件被删除,它是不能被恢复的,所以最好使用-i
参数。
chown & chgrp | 改变文件所有者和所属组
# 改变文件所有者
chown [选项] 所有者 文件名
# 改变文件所属组
chgrp [选项] 所属组 文件名
# 改变文件所有者和所属组
chown [选项] 所有者:所属组 文件名
参数:
-c
:只在文件的权限确实已经更改时,才显示其更改动作-f
:不显示大多数错误消息-R
:递归改变文件所有者和所属组
chmod | 改变文件权限
需要 root 权限
常见参数:
-c
:只在文件的权限确实已经更改时,才显示其更改动作-f
:不显示大多数错误消息-v
:详细显示命令的操作结果
# 改变文件权限
chmod [选项] 权限 文件名
# 改变文件权限,递归
chmod -R [选项] 权限 文件名
# eg
chmod 777 test1.c
# 将test1.c的权限改为777
chmod -R 777 test1
# 将test1目录下的所有文件的权限改为777
chmod -R 777 test1 test2 test3
# 将test1 test2 test3目录下的所有文件的权限改为777
chmod a+x test1.c
# 为所有用户添加test1.c的执行权限
# a代表所有用户(所有者-u,所属组-g,其他用户-o)
chmod u+r test1.c
# 为所有者添加test1.c的读权限
chmod 700 test1.c
# 将test1.c的权限改只有所有者有读写执行权限
grep | 查找文件内容
参数:
-c
:只输出匹配行的计数-i
:忽略大小写-n
:显示匹配行及行号-v
:显示不包含匹配文本的所有行-h
:不显示文件名-l
:仅显示包含匹配文本的文件名-s
:不显示不存在或无匹配文本的错误信息
# 在根目录下查找包含hello的文件
grep "hello" / -r
# 在根目录下查找包含hello的文件,忽略大小写
grep -i "hello" / -r
# 忽略子目录
grep -i "hello" / -r -d skip
# 匹配a或b
grep -E "a|b" / -r
# 也可以通过管道符号来过滤其他命令的输出
# 查看所有进程,过滤出包含node的进程,并显示行号
ps -e | grep -n node
# 查看所有进程,过滤出包含node的进程,并显示匹配行的计数
ps -ef | grep -c node
# 查看所有进程,过滤出不包含node的进程,再过滤出包含node的进程
ps -ef | grep -v node | grep node
# 查看当前目录下的文件,过滤出包含root的文件,并显示行号
ll | grep -n root
find | 查找文件
在指定目录中搜索文件,它的使用权限是所有用户
find [路径] [选项] [描述]
其中的路径为文件搜索路径,系统开始沿着此目录树向下查找文件。它是一个路径列表,相互用空格分离。 若缺省路径,那么默认为当前目录。 其中的描述是匹配表达式,是 find 命令接受的表达式。
选项常见参数:
depth
:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找mount
:在查找文件时,不跨越文件系统 mount 点
描述常见参数:
-name
:按照文件名查找文件(支持通配符*和?)-perm
:按照文件权限来查找文件-user
:按照文件属主来查找文件-size
:按照文件大小来查找文件-type
:按照文件类型来查找文件
locate | 查找文件
建立索引来查找文件,速度比 find 快,但是索引不是实时更新的,所以可能会找不到最新的文件
ubuntu 默认没有安装该命令,需要自己安装 mlocate(用法不一样)
sudo apt-get install mlocate
ln | 创建链接文件
软连接(常用):类似于 windows 的快捷方式,指向文件的路径
硬链接:在目标处创建一个和原文件一样的文件,文件内容会同步更改但是两个文件的 inode 不同
# 创建软连接
ln -s 源文件 目标文件
# eg
ln -s test1.c test2.c
# 创建硬链接
ln 源文件 目标文件
mount | 挂载文件系统
文件系统挂载命令
df | 查看文件系统磁盘使用情况
df -h
du | 显示目录或文件的大小
# 查看当前目录下的文件大小(包括子目录),并以人类可读的方式显示
du -h
# 查看当前目录下的文件大小(包括子目录),并以人类可读的方式显示,只显示最大深度为2的目录
du -ah --max-depth=2
lsblk | 查看磁盘信息
# 查看磁盘详细信息
lsblk -f
打包压缩相关
gzip | 对文件进行压缩和解压缩
gzip [选项] 文件名
# eg
gzip test1.c
# 压缩test1.c,生成test1.c.gz
# 压缩后的文件名为原文件名加上.gz后缀
gzip -d test1.c.gz
# 解压test1.c.gz,生成test1.c
# 解压后的文件名为原文件名去掉.gz后缀
常见参数:
-c
:将压缩的数据输出到屏幕上,不影响原文件-d
:解压缩-r
:递归压缩目录下的所有文件(分别压缩,不会生成一个压缩包)-l
:显示压缩文件的信息-t
:测试压缩文件的完整性-v
:显示压缩的过程信息
tar | 打包压缩文件目录
先打包成一个文件,再压缩
tar [选项] [打包后的文件名] 文件目录列表
常见参数:
-c
:创建打包文件-r
:向打包文件末尾追加文件-x
:解包-v
:显示打包过程-z
:调用 gzip 来压缩打包文件,与-x 联用时调用 gzip 完成解压缩-j
:调用 bzip2 来压缩打包文件,与-x 联用时调用 bzip2 完成解压缩-Z
:调用 compress 来压缩打包文件,与-x 联用时调用 compress 完成解压缩
打包请务必携带打包后的文件名(
.tar
也要写)
# 打包
tar -cvf david.tar david
# 将david目录打包成david.tar
# 解包
tar -xvf david.tar
# 将david.tar解包到当前目录
文件比较合并相关命令
diff | 比较文件内容的差异
# 比较两个文件的差异
diff [选项] 文件1 文件2
常见参数:
-r
:递归比较目录下的所有文件-q
:只显示是否有差异,不显示具体差异-u
:以上下文的方式显示差异
patch | 合并文件
# 合并文件
patch [选项] [文件1 [文件2]]
常见参数:
-b
:生成备份文件-d
:把 dir 设置为解释补丁文件名的当前目录-e
:把输入的补丁文件看作是 ed 脚本-pnum
:剥离文件名中的前 NUM 个目录部分-t
:在执行过程中不要求任何输入-v
:显示 patch 的版本号
vim | 代码编辑器
命令行模式功能
功能键 | 功能 |
---|---|
i | 切换到插入模式,在目前的光标所在处插入输入的文字,已存在的文字会向后退 |
a | 切换到插入模式,并从目前光标所在位置的下一个位置开始输入文字 |
o | 切换到插入模式,且从行首开始插入新的一行 |
[ctrl]+[b] | 屏幕往“后”翻动一页 |
[ctrl]+[f] | 屏幕往“前”翻动一页 |
[ctrl]+[u] | 屏幕往“后”翻动半页 |
[ctrl]+[d] | 屏幕往“前”翻动半页 |
0(数字 0) | 光标移到本行的开头 |
G(注意需要大写) | 光标移动到文件的最后 |
nG | 光标移动到第 n 行 |
$ | 移动到光标所在行的“行尾” |
n<Enter> | 光标向下移动 n 行 |
/name | 在光标之后查找一个名为 name 的字符串 |
?name | 在光标之前查找一个名为 name 的字符串 |
x | 删除光标所在位置的一个字符 |
X(大写 x) | 删除光标所在位置的前一个字符 |
dd | 删除光标所在行 |
ndd | 从光标所在行开始向下删除 n 行 |
yy | 复制光标所在行 |
nyy | 复制光标所在行开始的向下 n 行 |
p | 将缓冲区内的字符粘贴到光标所在位置(与 yy 搭配) |
u | 恢复前一个动作 |
底行模式功能
i
进入编辑模式ESC
退出编辑模式:wq
保存并退出:w
保存:w filename
另存为:q!
不保存退出:set nu
显示行号:set nonu
取消行号:s
查找(替换)字符串:s/old/new
将当前行第一个 old 替换为 new:s/old/new/g
将当前行所有 old 替换为 new:#,#s/old/new
将 #,# 行间所有 old 替换为 new- eg:
:1,5s/old/new/g
将 1-5 行间所有 old 替换为 new
- eg:
:%s/old/new/g
将文件内所有 old 替换为 new:%s/old/new/gc
将文件内所有 old 替换为 new,且替换前提示
emacs | 代码编辑器
有 GUI 的代码编辑器,可以在 ubuntu 软件中心下载