目录
文件系统
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
# 755root 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 testrmdir | 删除空目录
rmdir 只能删除空目录,如果目录中有文件,则不能删除
# 删除空目录
rmdir [选项] 目录名
# 一次性删除多个空目录
rmdir [选项] 目录名1 目录名2 目录名3cat | 查看文件内容
# 查看文件内容
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 rootfind | 查找文件
在指定目录中搜索文件,它的使用权限是所有用户
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 -hdu | 显示目录或文件的大小
# 查看当前目录下的文件大小(包括子目录),并以人类可读的方式显示
du -h
# 查看当前目录下的文件大小(包括子目录),并以人类可读的方式显示,只显示最大深度为2的目录
du -ah --max-depth=2lsblk | 查看磁盘信息
# 查看磁盘详细信息
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 软件中心下载
