Skip to content

目录

文件系统

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:执行权限
shell
# 注意,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

shell
# 例如
# rwxr-xr-x
# 4+2+1 4+0+1 4+0+1
# 755

root testgroup

第一个 root 代表文件所有者,第二个 testgroup 代表文件所属组

文件指令

cd | 切换工作目录

shell
# 没啥好说的
# 返回上一个工作目录
cd -
# 回到用户目录
cd ~

pwd | 显示当前工作目录

shell
# 没啥好说的

ls | 显示文件或目录信息

shell
# 查看当前目录下的文件
ls
# 查看当前目录下的文件,包括隐藏文件(以.开头的文件)
ls -a

# 查看当前目录下的文件,包括隐藏文件,以及文件的详细信息
ls -al

# 查看当前目录下的文件类型
ll
# 等价于
ls -l

# 查看当前目录的详细信息
ls -d

更多参数请使用ls --help查看

mkdir | 创建目录

shell
# 创建目录
mkdir [选项] 目录名

# 创建多级目录
mkdir -p 目录名
# 如果路径上的目录不存在,则自动创建,不会报错

# 对新目录设置权限
mkdir -m 权限 目录名
# 例如
mkdir -m 777 test

rmdir | 删除空目录

rmdir 只能删除空目录,如果目录中有文件,则不能删除

shell
# 删除空目录
rmdir [选项] 目录名

# 一次性删除多个空目录
rmdir [选项] 目录名1 目录名2 目录名3

cat | 查看文件内容

shell
# 查看文件内容
cat 文件名

# 查看文件内容,同时显示行号
cat -n 文件名

# 查看文件内容,同时显示行号,空行不显示
cat -b 文件名

# 反向显示文件内容
tac 文件名
C
// test1.c
#include <stdio.h>
void main(){
    printf("Hello World! test1");
}

cp | 复制文件或目录

cp 命令用于复制文件或目录 vim

shell
# 复制文件
cp [选项] 源文件 目标文件

# 复制目录
cp [选项] 源目录 目标目录

# 复制多个文件到目录
cp [选项] 源文件1 源文件2 源文件3 目标目录

参数

  • -a:相当于-dpR,保留源文件的属性,递归复制目录,保留链接文件
  • -d:复制时保留链接文件
  • -f:强制复制,如果目标文件已存在,则覆盖(ubuntu 默认)
  • -i:交互式复制,如果目标文件已存在,则提示用户是否覆盖
  • -l:创建硬链接文件
  • -p:保留源文件的属性
  • -r:递归复制目录

mv | 移动文件或目录

选项:

  • -i:交互式操作,如果目标文件已存在,则提示用户是否覆盖
  • -f:禁止交互操作。在 mv 操作要覆盖某己有的日标文件时不给任何指示,在指定此选项后,选项将不再起作用
shell
# 移动文件(重命名)
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:递归删除目录
shell
# 删除文件
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 | 改变文件所有者和所属组

shell
# 改变文件所有者
chown [选项] 所有者 文件名

# 改变文件所属组
chgrp [选项] 所属组 文件名

# 改变文件所有者和所属组
chown [选项] 所有者:所属组 文件名

参数:

  • -c:只在文件的权限确实已经更改时,才显示其更改动作
  • -f:不显示大多数错误消息
  • -R:递归改变文件所有者和所属组

chmod | 改变文件权限

需要 root 权限

常见参数:

  • -c:只在文件的权限确实已经更改时,才显示其更改动作
  • -f:不显示大多数错误消息
  • -v:详细显示命令的操作结果
shell
# 改变文件权限
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:不显示不存在或无匹配文本的错误信息
shell
# 在根目录下查找包含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 不同

shell
# 创建软连接
ln -s 源文件 目标文件
# eg
ln -s test1.c test2.c
# 创建硬链接
ln 源文件 目标文件

mount | 挂载文件系统

文件系统挂载命令

df | 查看文件系统磁盘使用情况

shell
df -h

du | 显示目录或文件的大小

shell
# 查看当前目录下的文件大小(包括子目录),并以人类可读的方式显示
du -h

# 查看当前目录下的文件大小(包括子目录),并以人类可读的方式显示,只显示最大深度为2的目录
du -ah --max-depth=2

lsblk | 查看磁盘信息

shell
# 查看磁盘详细信息
lsblk -f

打包压缩相关

gzip | 对文件进行压缩和解压缩

shell
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 | 打包压缩文件目录

先打包成一个文件,再压缩

shell
tar [选项] [打包后的文件名] 文件目录列表

常见参数:

  • -c:创建打包文件
  • -r:向打包文件末尾追加文件
  • -x:解包
  • -v:显示打包过程
  • -z:调用 gzip 来压缩打包文件,与-x 联用时调用 gzip 完成解压缩
  • -j:调用 bzip2 来压缩打包文件,与-x 联用时调用 bzip2 完成解压缩
  • -Z:调用 compress 来压缩打包文件,与-x 联用时调用 compress 完成解压缩

打包请务必携带打包后的文件名(.tar也要写)

shell
# 打包
tar -cvf david.tar david
# 将david目录打包成david.tar

# 解包
tar -xvf david.tar
# 将david.tar解包到当前目录

文件比较合并相关命令

diff | 比较文件内容的差异

shell
# 比较两个文件的差异
diff [选项] 文件1 文件2

常见参数:

  • -r:递归比较目录下的所有文件
  • -q:只显示是否有差异,不显示具体差异
  • -u:以上下文的方式显示差异

patch | 合并文件

shell
# 合并文件
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
    • :%s/old/new/g 将文件内所有 old 替换为 new
    • :%s/old/new/gc 将文件内所有 old 替换为 new,且替换前提示

emacs | 代码编辑器

有 GUI 的代码编辑器,可以在 ubuntu 软件中心下载

参考资料

Copyright © 2022 田园幻想乡 浙ICP备2021038778号-1