文件目录管理
1. Linux目录结构
- Linux的文件系统是采用层级式的树状目录结构,在此结构中的最上层是根目录"/"。
- Linux文件或目录名称最长有256个字符
- Linux文件和目录名称大小写敏感
- 以
.
开头的文件为隐藏文件 - 同级目录中,不允许文件和目录同名。
常用目录速查表:
目录 | 说明 |
---|---|
/ | 根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始 |
/bin(binary) | 存放二进制程序和系统常用命令,主要用于具体应用 |
/sbin(system binary) | 存放系统专用二进制程序和命令,需一定权限执行的命令 |
/usr/bin | 存放后期安装的一些软件 |
/usr/sbin | 存放超级用户的一些管理程序 |
/boot | 放置linux系统启动时用到的一些文件,如Linux的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub |
/dev | 存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt |
/etc | 系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d |
/home | 一般用户的主目录或ftp站点目录 |
/lib、/usr/lib、/usr/local/lib | 系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助 |
/lost+fount | 系统异常产生错误时,会将一些遗失的片段放置于此目录下 |
/mnt、/media | 光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。 |
/proc | 此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有 /proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等 |
/root | 管理员主目录 |
/tmp | 一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下 |
/srv | 服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内 |
/usr | 应用程序存放目录,/usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local: 存放软件升级包。/usr/share/doc: 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录。 |
/var | 放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下 |
/opt | 给主机额外安装软件所存放的目录 |
2. 查看文件目录
命令 | 说明 |
---|---|
cd [dir] | 切换到指定目录 |
ls [-options] [dir,file] | 查看指定目录所有内容 |
tree [-options] [dir] | 可以以树状图方式展示目录内容(层级子目录及文件) |
pwd [-options] | 打印当前工作目录 |
cat [-options] [file] | 查看文件内容/创建文件/文件合并/追加文件内容等 |
more [-options] file | 分页显示文件内容 |
2.1 cd 命令
# 命令格式
$ cd [dir]
cd
是change directory缩写,其功能为改变当前工作目录。
命令 | 含义 |
---|---|
cd | 切换到当前用户主目录(/home/username ) |
cd ~ | 切换到当前用户主目录(/home/username ) |
cd . | 保持当前目录不变 |
cd .. | 切换到上级目录 |
cd - | 在上次目录和当前目录来换切换 |
2.2 ls 命令
# 命令格式
$ ls [-options] [dir,file]
ls
是list缩写,其功能为列出目录的内容(文件及子目录),类似于Dos的dir
命令
2.2.1 options
options | 含义 |
---|---|
-a | 显示目录下 所有 子目录与文件,包含隐藏文件 |
-l | 以列表方式显示文件的详细信息 |
-h | 配合-l 以人性化的方式显示 文件大小,-h 单独使用没有效果 |
注:options可以叠加使用且顺序无关。
# 以下所有命令等价
$ ls -a -l -h
$ ls -l -h -a
$ ls -alh
$ ls -lha
2.2.2 parameter
- parameter可以为文件或目录。parameter为目录则列出给定目录下的内容,parameter为文件名则列出给定文件。
- parameter可以使用通配符进行模糊匹配。模糊匹配结果为多个时会列出匹配的所有文件和目录。通配符使用方式与正则类似。
通配符 | 含义 |
---|---|
* | 任意多个任意字符 |
? | 一个任意字符 |
[] | 匹配字符组中任意一个。[1,2,3] 等价于[1-3] ,[a,b,c] 等价于[a-c] |
ls colin* # 匹配 以colin开头
ls colin? # 匹配 以colin+单个字符
ls colin[1-3] # 匹配 colin1,colin2,colin3
2.2.3 ls -l 内容详解
如上图所示,各列依次为 权限 | 硬链接数 | 所有者 | 所在组 | 文件尺寸 | 修改时间 | 名称
1) 权限
权限列共有10个字符组成,其含义如下:
类别 | 所有者权限 | 所在组权限 | 其他组权限 | ||||||
---|---|---|---|---|---|---|---|---|---|
d (目录) | r | w | x | r | - | x | r | - | x |
- (普通文件) | r | w | - | r | - | - | r | - | - |
- 第一列文件类型速查表如下(仅供查阅),其中d (目录),- (普通文件)最为常见:
标识符 | 含义 |
---|---|
d | 目录 |
- | 普通文件 |
b | 块特殊文件 |
c | 字符特殊文件 |
l | 软链接文件。软链接文件名列格式为: 链接名 -> 源文件地址 |
p | 先进先出(FIFO)的管道特殊文件 |
s | 本地套接字 |
- 每组权限三列依次为 读|写|执行。
r
表示可读;w
表示可写;x
表示可执行;-
表示无对应权限
关于权限的详细信息参阅 权限管理
2) 硬链接数
关于硬链接数,可参阅 硬链接数
2.3 tree 命令
# 命令格式
$ tree [-options] [dir]
tree
可以以树状图方式展示目录内容(层级子目录及文件)- 系统若没有安装
tree
命令,可以通过sudo apt install tree
来进行安装。
options | 含义 |
---|---|
-d | 限制只显示目录,忽略文件 |
# 显示当前目录树状图
$ tree
# 显示~/Desktop 的目录树状结构
$ tree -d ~/Desktop
2.4 cat 命令
# 命令格式
$ cat [-options] [file]
cat
是Concatenate缩写,其功能包含查看文件内容、创建文件、文件合并、追加文件内容等。其中最常用来查看文本文件内容。 cat
会一次显示所有内容,适合 查看内容较少 的文本文件
options | 含义 |
---|---|
-b | 显示非空行号,空行也显示但不编行号,可以用于统计有效代码行数 |
-n | 显示所有行号 |
nl file
与cat -b file
效果相同,都可以查看文本文件内容并显示非空行号
2.5 more 命令
# 命令格式
$ more [-options] file
more
命令可以用于分屏显示文本文件内容,每次只显示一页内容more
适合于 查看内容较多 的文本文件- 使用
more
查看文件时常用操作键:
操作键 | 功能 |
---|---|
Blank | 下一屏 |
Enter | 下一行 |
b | 上一屏 |
q | 退出 |
/keyword | 搜索关键字 |
3. 新建和删除
命令 | 说明 |
---|---|
touch [-options] file | 若文件不存在则创建文件,否则修改文件最后编辑时间 |
mkdir [-options] dir | 创建目录。-p 可以层级创建目录,如mkdir -p a/b/c |
rm [-options] file | 删除文件或目录,删除后不可恢复 |
rmdir [-options] dir | 删除目录,目录必须为空 |
3.1 rm 命令
# 命令格式
$ rm [-options] file
rm
是remove缩写,其功能是删除文件或目录(不可恢复)。
1) options
options | 含义 |
---|---|
-i | 开启删除确认提示,所有待删除文件将逐次提示 |
-r | 删除文件或 递归删除目录 (包含子目录和文件) |
-f | 强制删除,忽略不存在文件 |
注:删除目录可以使用rmdir dir
或rm -r dir
,前者只能删除空目录,后者则可以递归删除目录(不管是否为空)
2) parameter
rm
命令的parameter同样可以使用通配符。
# 删除以ab开头的文本文件
$ rm ab*.txt
# 删除 test目录
$ rm -r test
# 清空当前目录,谨慎使用
$ rm -rf *
4. 拷贝和移动
命令 | 说明 |
---|---|
cp [-options] source_file target_file | 复制文件或目录 |
mv [-options] source_file/dir target_file/dir | 移动/重命名 文件或目录 |
4.1 cp 命令
cp
是copy缩写,其功能是将拷贝文件或目录。
# 命令格式
$ cp [-options] source_file target_file
1) options
options | 含义 |
---|---|
-a | 该选项通常在复制目录时使用,它保留链接、文件属性,并递归地复制目录,简单而言,保持文件原有属性。 |
-i | 开启覆盖文件提示。cp 执行时会 默认覆盖 同名目标文件。建议每次使用-i 进行安全复制 |
-r | 复制文件或 递归复制目录 (包含子目录和文件)。格式为:cp -r source_dir target_dir |
-v | 显示拷贝进度 |
2) parameter
- 目标文件若与源文件同名,则
target_file
参数可以只写目录部分,省略目标文件名。 - 操作对象为目录时,如果
target_dir
存在,则将源目录拷贝至target_dir
;如果target_dir
不存在,则将源目录拷贝至../target_dir
重命名为指定目录。mv操作亦是如此。
# 将 ~/Documents/readme.txt 拷贝为 ~/Desktop/readme.txt
$ cp ~/Documents/readme.txt ~/Desktop
# 将 ~/Download/Python 拷贝到 ~/Desktop中
$ cp -r ~/Download/Python ~/Desktop
4.2 mv 命令
# 命令格式
$ mv [-options] source_file/dir target_file/dir
mv
命令是move缩写,其功能是移动/重命名文件或目录。如果移动文件或目录的源路径和目标路径一致,仅目标名称不同,可以实现文件或目录重命名。mv
命令默认可以操作文件或目录,不需要提供像cp
和rm
命令一样使用-r
选项
options | 含义 |
---|---|
-i | 开启覆盖文件提示。mv 执行时会 默认覆盖 同名目标文件。建议每次使用-i 进行安全移动 |
-v | 显示移动进度 |
# 将~/Download/Python目录移动到 ~/Desktop
# 若~/Desktop/PythonCourse目录存在则拷贝至其中,若不存在则拷贝到~/Desktop中并重命名为PythonCourse
$ mv ~/Download/Python ~/Desktop/PythonCourse
# 将当前目录 test.txt 重命名为 demo.txt
$ mv -i test.txt demo.txt
5. 搜索/重定向/管道
命令 | 说明 |
---|---|
find [path] [-options] [expression] | 在目录中搜索文件 |
grep [-opinions] [pattern] [file] | 在文本文件中查找内容 |
echo [-option] [string] | 在终端中打印字符串。通常会和重定向联合使用 |
重定向和管道 | 重定向:将终端输出保存至文件;管道:对终端输出进行再操作 |
5.1 搜索查找
5.1.1 搜索文件
# 命令格式
$ find [path] [-options] [expression]
find
命令功能非常强大,通常用来在特定目录下搜索符合条件的文件- 文件查找路径缺省则在当前文件件搜索,包含子目录
# 在桌面及其子目录搜索所有txt文档
$ find ~/Desktop -name "*.txt"
# 在当前目录及子目录搜索文件名包含“app”的文件
$ find -name "*app*"
5.1.2 查找文件内容
# 命令格式
$ grep [-opinions] [pattern] [file]
grep
命令是一个强大的文本搜索工具grep
允许对文本进行模式查找
1) options
options | 含义 |
---|---|
-n | 显示行号 |
-v | 搜索不匹配内容(相当于搜索结果取反) |
-i | 忽略字母大小写 |
2) pattern
常用的两种搜索模式,正则匹配
参数 | 含义 |
---|---|
^b | 行首,搜索以b开头的行 |
e$ | 行尾, 搜索以e结尾的行 |
# 在test.txt中搜索包含colin的行
$ grep colin test.txt
# 在test.txt中忽略大小写搜素以colin开头的行并显示行号
$ grep -ni ^colin test.txt
5.2 重定向和管道
重定向和管道都需要配合其他命令使用。
5.2.1 重定向
重定向命令可以将终端输出内容保存到文件中
>
将终端输出保存到文件中。文件不存在则创建,存在则覆盖>>
将终端输出追加到文件末尾。文件不存在则创建,存在则追加
# 将“Hello”保存到 a.txt 中
$ echo Hello > a.txt
# 将当前目录树状结构 追加到 a.txt 中
$ tree -d >> a.txt
echo
和重定向命令经常一起使用以将输出的文本保存到文件中。
如果echo
输出内容较为复杂如包含多个空格或换行,务必使用引号包裹以避免被解析为多个命令参数。如果echo
输出内容换行中包含\
等特殊字符,必须使用单引号包裹才能保留换行,这在docker命令中常见。
# 错误用法。双引号内容中有'\',换行将被忽略
$ echo "docker run \
-d \
--name my-mysql \
-e MYSQL_ROOT_PASSWORD=pwd \
mysql"
# 正确用法。使用单引号,换行将被保留
$ echo 'docker run \
-d \
--name my-mysql \
-e MYSQL_ROOT_PASSWORD=pwd \
mysql'
5.2.2 管道
管道是将一个命令的输出作为另一个命令的输入。可以理解为现实生活中一根管子,管子一头塞东西进去,另一头取东西出来。
常用管道命令有:
more
:分屏显示输出内容grep
:对输出内容进行查询
# 分屏显示 当前目录所有内容
$ ls -lha | more
# 在前目录所有内容中 搜索名称包含colin的文件或目录
$ ls -lha | grep colin
6. 文件/目录链接
6.1 软链接与硬链接
Linux中链接分为软链接和硬链接。软链接类似与Windows中的快捷方式和mac OS的替身。硬链接指可以访问到文件或目录的途径,相当于文件或目录别名。
在Linux中文件名与文件内容是分开存储的,如同C#中引用类型的堆栈内存存储方式。文件名如同一个指针指向文件内容。软硬链接也都是文件指针。不同的是软链接指向的是文件名,硬链接指向的文件内容。
Linux中删除文件首先删除文件引用,只有文件没有引用(硬链接数=0)才会被删除。如同C#中文件对象没有引用时才会被GC。软硬链接指向同一个源文件,源文件删除后,实际删除的是源文件名,所以软链接会无法使用。硬链接仍指向源文件内容,文件并不会真的删除,所以硬链接仍然正常使用。
硬链接数
硬链接数表示有多少种方式访问到对应的目录或文件。
- 文件只能通过绝对路径访问,所以文件硬链接数一般为1,有文件硬链接同样也会增加文件硬链接数
- 目录可以通过绝对路径访问,
.
方式访问。所以目录的硬链接数至少为2(无子目录)。有直接子目录时也可以通过..
方式访问,所以每多一个直接子目录硬链接数+1。Linux目录的硬链接数等于直接子目录数量+2。mac OS的目录硬链接数与Linux计算方式不同
6.2 ln 命令
# 命令格式
$ ln [-options] source target
ln
命令用于创建文件链接(一般指软链接)-s
表示建立软链接文件,默认建立硬链接文件- 源文件(目录)要使用绝对路径。否则链接文件移动后会造成链接文件指向出错而无法使用
# 在当前目录建立软链接文件ln123并指定/home/colin/Desktop/demo/123.txt
$ ln -s /home/colin/Desktop/demo/123.txt ln123
7. 打包压缩
命令 | 说明 |
---|---|
tar [-options] [file] | 打包解包文件 |
zip [-options] [file] | 压缩或解压zip文件 |
7.1 打包解包
# 命令格式
$ tar [-options] [file]
tar
是Linux最常用的备份工具。其功能是把一系列文件或目录归档到一个tar包文件中,也可以将tar包解档tar
归档操作只是打包并不会压缩文件[file]
如有多个文件或目录,使用空格分割依次排列即可
options | 含义 |
---|---|
-c | 生成档案文件 |
-x | 解开档案文件 |
-v | 列出归档解档 |
-f | 指定档案文件名称。-f 后面是tar包名称,所以在options中放在最后 |
-t | 列出档案中包含的文件 |
-z | 使用gzip 压缩或解压 |
-j | 使用bzip2 压缩或解压 |
-C | 解档或解压到指定目录。目录必须存在 |
# 将English.txt,Chinese.txt,Europe(目录)归档为languages.tar
$ tar -cvf languages.tar English.txt Chinese.txt Europe
# 将languages.tar解档到当前目录
$ tar -xvf languages.tar
7.2 压缩解压
1) gzip
gzip
是Linux下一种流行的压缩方式。
- 用
gzip
压缩tar
包文件后的压缩文件扩展名是.tar.gz
,这是Linux中最常见的压缩格式 tar
命令使用-z
可以调用gzip
对tar包进行压缩,方便实现打包压缩- 也可单独使用
gzip
压缩tar包或解压压缩文件,单使用较少。一般联合tar
命令使用较多
# 将English.txt,Chinese.txt,Europe(目录)压缩为languages.tar.gz
$ tar -zcvf languages.tar.gz English.txt Chinese.txt Europe
# 将languages.tar.gz解压到用户桌面
$ tar -zxvf languages.tar.gz -C ~/Desktop
2) bzip2
bzip2
与gzip
类似也是一种流行压缩方式。
- 用
bzip2
压缩tar
包文件后压缩文件扩展名是.tar.bz2
tar
命令使用-j
可以调用bzip2
对tar包进行压缩。
# 将English.txt,Chinese.txt,Europe(目录)压缩为languages.tar.bz2
$ tar -jcvf languages.tar.bz2 English.txt Chinese.txt Europe
# 将languages.tar.bz2解压到用户桌面
$ tar -jxvf languages.tar.bz2 -C ~/Desktop
3) zip/unzip
zip压缩格式不同于gzip和bzip2联合tar
命令使用,zip可以指定文件或目录压缩到指定的压缩包中。zip
格式的压缩包常用于各大平台操作系统。
# 命令格式
$ zip [-options] zip path
$ unzip [-options] path zip
通过zip压缩文件的目标文件不需要指定扩展名,默认扩展名为zip。
# 将用户Download目录递归压缩到test.zip中
$ zip -r test ~/Download
# 将test.zip解压到temp目录中
$ unzip -d temp test
8. vi/vim 编辑器
vi编辑器是linux下流行的文本编辑器。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。vim则是基于vi的高级编辑器。所有vim兼容vi所有的命令。Ubuntu部分版本的vi编辑器不太好用,推荐使用vim替代。
8.1 工作模式
vi编辑器有以下三种工作模式。
8.1.1 命令模式
# 查看文件,如果文件不存在则新建文件
$ vi [文件名] # 打开vi命令行编辑器并进入查看模式
进入vi编辑器之后,默认进入命令模式。任何模式,按一下ESC键,即可进入命令模式。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的Vi命令,则Vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合法命令,Vi会响铃报警。
8.1.2 编辑模式
在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。
命令 | 功能 |
---|---|
i | 插入光标前一个字符 |
I | 插入行首 |
a | 插入光标后一个字符 |
A | 插入行未 |
o | 向下新开一行,插入行首 |
O | 向上新开一行,插入行首 |
8.1.3 末行模式
# 所有命令必须进入命令模式后才能执行,命令执行完毕自动进入查看模式
: # 进入末行模式,可以执行以下命令
wq # 保存并退出
q! # 不保存退出
set nu # 显示行号
set nonu # 取消行号
%d # 清空文件内容
输入任意数字 # 光标定位到指定行号的行首位置
在命令模式下,用户按“:”键即可进入末行模式下,此时Vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令执行完后,Vi自动回到命令模式。
8.2. 常用操作
8.2.1 命令模式
1) 移动光标
命令 | 功能 |
---|---|
k | 上移 |
j | 下移 |
h | 左移 |
l | 右移 |
M | 光标移动到中间行 |
L | 光标移动到屏幕最后一行行首 |
G | 移动到指定行,行号 -G |
w | 向后一次移动一个字 |
b | 向前一次移动一个字 |
{ | 按段移动,上移 |
} | 按段移动,下移 |
Ctr-d | 向下翻半屏 |
Ctr-u | 向上翻半屏 |
Ctr-f | 向下翻一屏 |
Ctr-b | 向上翻一屏 |
gg | 光标移动文件开头 |
光标移动在默认的vi中只能使用kjhl
来控制,vim则增加了上下左右键的支持支持。
2) 删除
命令 | 功能 |
---|---|
x | 删除光标后一个字符,相当于 Del |
X | 删除光标前一个字符,相当于 Backspace |
dd | 删除光标所在行,n dd 删除指定的行数 D: 删除光标后本行所有内容,包含光标所在字符 |
d0 | 删除光标前本行所有内容,不包含光标所在字符 |
dw | 删除光标开始位置的字,包含光标所在字符 |
3) 撤销
u|一步一步撤销 Ctr-r|反撤销
4) 重复
命令 | 功能 |
---|---|
. | 重复上一次操作的命令 |
5) 文本行移动
命令 | 功能 |
---|
|文本行右移 <<|文本行左移
6) 复制粘贴
命令 | 功能 |
---|---|
y | 复制选中 |
yy | 复制当前行,n yy 复制 n 行 |
p | 在光标所在位置向下新开辟一行,粘贴 |
7) 可视模式
命令 | 功能 |
---|---|
v | 按字符选中文本 |
V | 按行选中,选中文本可视模式可以配合 d, y, >>, << 实现对文本块的删除,复制,左右移动 |
8) 查找操作
命令 | 功能 |
---|---|
/或? | str查找 |
n | 下一个 |
N | 上一个 |
8.2.2 末行模式
# 末行模式下,将光标所在行的abc替换成123
%s/abc/123/g
# 末行模式下,将第一行至第10行之间的abc替换成123
1, 10s/abc/123/g