1. 文件目录结构
标准目录结构
以下结构几乎适用于所有Linux系统
boot
文件中存放的是和启动相关的内容dev
文件存放的是设备相关内容,如硬盘、光盘、null 等etc
文件是用来存放一些重要的配置文件,它的作用基本等价于 windows 系统中注册表的作用。因此管理 linux 主要就是在改 etc 中的各种设置home
文件存放的是用户的数据run
文件存放的是运行中生成的相关数据bin(binary)
文件存放的是用户可执行的二进制文件,而sbin
文件存放的是系统管理员常用的工具tmp
文件是用来存放临时数据usr
文件存放的是大型的数据var
文件存放的是可变的内容,如日志、缓存数据等
文件系统
- 文件和目录被组织成一个单根倒置树结构
- 文件系统从根目录下开始,用
/
表示 - 根文件系统(rootfs):root filesystem
- 文件名称区分大小写(由文件系统决定的)。当文件系统是标准 Linux 文件系统时(Ext4、XFS),文件名大小写敏感。如果是 windows 文件系统(FAT),则文件名大小写不敏感
- 以
.
开头的文件为隐藏文件(使用ll
命令的-a
参数才能列出) - 路径分隔用
/
- 文件有两类数据
- 元数据(文件属性):metadata
- 数据(文件内容):data
- 文件系统分层结构:LSB Linux Standard Base
- FHS:(Filesystem Hierarchy Standard文件的分层结构标准)http://www.pathname.com/fhs/
总之,文件的存放是有规则的而不可以随意存放,可以参照以上的标准目录存放对应的文件。
文件名规则
touch
新建文件
- 文件名最长255个字节
- 包括路径在内文件名称最长4095个字节
蓝色-->目录;绿色-->可执行文件;红色-->打包文件;浅蓝色-->链接文件(软链接);灰色-->其他文件
(需要注意的是,有时候文件后缀也会影响文件名的颜色,这在/etc/DIR_COLORS
中都有定义)- 除了斜杠和 NUL 所有字符都有效,但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用它们
Linux上的应用程序的组成部分
- 二进制程序:
/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
- 库文件:
/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
- 配置文件:
/etc, /etc/DIRECTORY, /usr/local/etc
- 帮助文件:
/usr/share/man, /usr/share/doc, /usr/local/share/man,/usr/local/share/doc
Linux下的文件类型
-
普通文件d
目录文件b
块设备c
字符设备l
符号链接文件p
管道文件pipes
套接字文件socket
2. 文件目录命令
显示当前工作目录
- 每个 shell 和系统进程都有一个当前的工作目录 CWD(current work directory)
-
显示当前 shell CWD 的绝对路径
pwd
(printing working directory)-P
显示真实物理路径-L
显示链接路径(默认)
绝对和相对路径
-
绝对路径
以正斜杠开始
/
完整的文件的位置路径
-
相对路径
指定相对于当前工作目录或某目录的位置
.
表示当前目录..
表示上一级目录 - 基名(文件本身的名字):
basename
取基名 - 目录名(文件所在文件夹的名字):
dirname
取目录名
更改目录
cd
(change directory)改变目录
- 切换至当前用户的主目录(home)
cd
- 切换至以前的工作目录
cd-
- 选项
-P
-
相关的环境变量
$PWD
当前目录路径$OLDPWD
上一次目录路径
列出目录内容
ls [options] [files or dirs]
列出当前目录的内容或指定目录
-a
包含隐藏文件-l
显示额外的信息-R
目录递归遍历-ld
目录和符链接信息-1
文件分行显示-S
按从大到小排序-Sr
按从小到大排序-r
倒序排-t
按 mtime(modify time 修改时间)排序-u
配合-t
选项,显示并按 atime(access time 访问时间)从新到旧排序-U
按目录存放顺序显示-x
按文件后缀排序
文件的三个时间
stat [filename]
查看文件的三个时间
-
ctime 变化时间
最后一次改变文件(属性或权限)或者目录(属性或权限)的时间
-
mtime 修改时间
最后一次修改文件(内容)或者目录(内容)的时间
-
atime 访问时间
最后一次访问文件(读取或执行)的时间
这些信息都记录在文件中,所以每发生一次读事件就会发生一次写事件,通常可以关闭该信息的记录,以提高系统性能
3. 文件通配符
文件通配符解决的是文件名匹配的问题
*
匹配零个或多个字符?
匹配任何单个字符~
当前用户家目录~username
某用户的家目录[0-9]
匹配数字范围[a-z]
字母[A-Z]
字母[wang]
匹配列表中的任何一个字符[^wang]
匹配除列表中字符以外的其他所有字符
预定义的字符类
[:digit:]:
任意数字,相当于0-9
[:lower:]:
任意小写字母[:upper:]:
任意大写字母[:alpha:]:
任意大小写字母[:alnum:]:
任意数字或字母[:blank:]:
水平空白字符[:space:]:
水平或垂直空白字符[:punct:]:
标点符号[:print:]:
可打印字符[:cntrl:]:
控制(非打印)字符[:graph:]:
图形字符[:xdigit:]:
十六进制字符
创建空文件和刷新时间
touch 命令
-
格式:
touch [OPTION]... FILE...
-a
仅改变 atime 和 ctime-m
仅改变 mtime 和 ctime
4. 文件管理命令
复制文件和目录
cp 命令只适合复制普通的文件,无法复制特殊文件(如硬盘文件等)
cp [OPTION] SRC DEST
cp常用选项
-i
:覆盖前提示-n
:不覆盖-r、-R
:递归复制目录及内部的所有内容-a
:归档(备份),相当于-dR --preserv=all
,复制文件的所有属性-d
:--no-dereference --preserv=links
不复制原文件,只复制链接名-
--preserv[=ATTR_LIST]
mode:权限ownership:属主属组
timestamp:
links
xattr
context
all
-p
:等同--preserv=mode,ownership,timestamp
-v
:--verbose
显示执行过程-f
:--force
-u
:--update
只复制源比目标更新的文件或目标不存在的文件-b
:目标存在,覆盖前先备份--backup=numbered
目标存在,覆盖前先备份加数字后缀
移动和重命名文件
mv [OPTION] SRC DEST
改名:mv f1 f2
移动:mv f1 /path/
边移动边改名:mv /root/f2 /data/f3
常用选项
-i
:交互式-f
:强制-b
:目标存在,覆盖前先备份
删除
生产环境下使用mv命令代替rm命令,删除某个文件时,可以把某文件移动到回收文件夹下
删除文件,必须对文件所在目录有执行和写权限才能删除文件
rm [OPTION]... FILE...
无论文件是否正在被使用都将被删除
常用选项
-i
交互式-f
强制删除-r
递归,rm 不能直接删文件夹,用-r
就可以--no-preserve-root
删除/根目录
释放空间
正在被使用的文件被删除后不会释放空间
查看已删除但是没有释放空间的文件 lsof |grep deleted
对于正在被使用的文件的删除,应先清空文件> filename
,再删除rm filename
>的用法
> filename
可以创建一个空文件,如果文件名存在则会覆盖并清空此文件
>> filename
如果文件名不存在,则创建一个新的空文件;如果文件名存在,原封不动,相较于> filename
更加安全
文件备份
cp file{,.bak}
等价于 cp file file.bak
,前者比后者的好处在于当文件名很长时,前者更节省时间
文件改名命令
rename
命令可以批量改名
以- ~开头的文件
创建并删除以-
开头的文件
touch -- -a
rm -- -a
创建并删除以~
开头的文件
touch '~wang'
rm '~wang'
目录操作
mkdir
创建目录
-p
:存在于不报错,且可自动创建所需的各目录-v
:显示详细信息-m MODE
:创建目录时直接指定权限
rmdir
删除空目录
-p
:递归删除父空目录-v
:显示详细信息
rmdir
只能删除空目录
5. 节点表结构
索引节点
inode(index node)包含一个文件的元数据,详细请看《操作系统》
inode是相对于分区而言的,同一分区下,inode编号是唯一的
查看文件的节点编号ll -i
空间不足的两种情况:
- 索引节点编号用完了
- 磁盘空间用完了
rm命令本质是释放inode编号,使编号可以被重用,并把数据块放在空闲列表中,删除目录项,数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
6. 软链接和硬链接
硬链接
- 本质是对一个文件,起多个名字
ln filename1 filename2
- 硬链接不能跨分区
- inode 是同一个
- 只支持文件
软链接
- 本质是一个指针
ln -s filename1 filename2
- inode 不同
- 支持文件和文件夹
- 支持跨分区
- 原始文件一般路径用相对路径,相对路径一定相对于软链接文件的路径
重置
reset
当终端窗口乱码后执行
file命令
file [options] <filename> ...
查看文件类型,使用cat
命令查看前,检查一下文件是什么类型的,直接查看非文本文件可能导致终端乱码
-b
列出文件辨识结果时,不显示文件名称-f
filelist列出文件filelist中文件名的文件类型-F
使用指定分隔符号替换输出文件名后默认的:
分隔符-L
查看对应软链接对应文件的文件类型--help
显示命令在线帮助
7. I/O重定向
Linux 默认给程序提供三种 I/O 设备
- 标准输入(STDIN) 0 ,默认接受来自键盘的输入
- 标准输出(STDOUT) 1 ,默认输出到终端窗口
- 标准错误(STDERR) 2 ,默认输出到终端窗口
在 Linux 中通常将键盘作为输入设备,而输出通常在终端窗口实现。
输入、输出、错误也都有对应的文件来表示。这里的错误指的是当我们执行一个错误指令,程序通过终端窗口弹出的错误信息。
对每一个在Linux里面打开的文件,系统都会分配一个数字,这个数字被称为文件描述符。这个数字代表着打开的文件,而我们用来输入的设备也是一个打开的文件,用0来表示。输出的设备用1来表示,输出的错误用2来表示。
打开的文件都有一个fd(file descriptor文件描述符)
若想查看文件或进程对应的数字,可以进入 proc 目录下对应数字的目录,目录中的fd代表了文件描述符
把标准输出重新定向到文件
1>
文件内容会被覆盖
set +C
允许覆盖
set -C
禁止将内容覆盖已有文件,但可追加
1>|
文件内容会被强制覆盖
1>>
原有内容基础上,追加内容
把标准错误重新定向到文件
2>
文件内容会被覆盖
2>|
文件内容会被强制覆盖
2>>
原有内容基础上,追加内容
把标准输出和错误重新定向到文件
&>
把标准输出和错误重定向到文件
要隐藏()标准输出和标准错误信息,可以重定向到 /dev/null
多条命令的重定向 (command1;command2) > file.log
把标准输入重定向到文件
<
单行重定向
<<
多行重定向,<<EOF
通常以EOF(end of file)作为多行重定向的开始和结束的标志
转换和删除字符
tr [OPTION].. SET1 [SET2]
默认从标准输入获取数据
-c
取字符集的补集-d
删除所有属于第一字符集的字符-s
把连续重复的字符以单独一个字符表示
小写转大写tr 'a-z' 'A-Z'
8. 重定向和管道
管道
command1 | command2 | command3 ...
|
左边命令的输出作为|
右边命令的输入
- 最后一个命令会在当前 shell 进程的子 shell 进程中执行用来
- 计算1+2+3+..+99+100的总和
echo {1..100} | tr ' ' + | bc
- 标准错误默认不能通过管道转发,可利用
command1 2>&1 | command2
或command1 |& command2
实现
分页查看
less
分页查看文件内容
重定向同时执行标准I/O
tee [-a]
-a
追加而不是覆盖ls | tee -a ls.log
9. 文件查找和压缩
locate
locate
搜文件依赖于 locate 数据库,把之前的文件建立在数据库中,基于数据库搜索,搜索速度快。当文件增加或删除后,数据库不会立即更新,所以会找不到。updatedb
更新数据库
locate [参数] 文件名
-i
不区分大小写的搜索-n N
只列举前N个匹配项目-r
使用正则表达式
find
实时查找工具,通过遍历指定路径完成文件查找,查找速度略慢
可能只搜索用户具备读取和执行权限的目录
find [path] [expression]
-maxdepth level
最大搜索目录深度-mindepth level
最小搜索目录深度。-depth
先处理目录内的文件,再处理目录-name "文件名称"
根据文件名查找,支持使用通配符-iname "文件名称"
根据文件名查找不区分大小写-inum 编号
根据 inode 查找-samefile 编号
相同inode号的文件-links n
链接数为n的文件-regex "PATTERN"
以PATTERN匹配整个文件路径,而非文件名称
根据属主、属组查找:
-user USERNAME
查找属主为指定用户(UID) 的文件-group GRPNAME
查找属组为指定组(GID) 的文件-uid UserlD
查找属主为指定的 UID 号的文件-gid GrouplD
查找属组为指定的 GID 号的文件-nouser
查找没有属主的文件-nogroup
查找没有属组的文件
根据文件类型查找-type TYPE
f
普通文件d
目录文件l
符号链接文件s
套接字文件b
块设备文件c
字符设备文件p
管道文件
空文件或空目录-empty
组合条件
- 与
-a
- 或
-o
- 非
-not
、!
根据文件大小来查找
-size[+-]#UNIT
常用单位:k、M、G、c (byte)
tar打包
tar命令可以记录Linux文件权限位字段以及符号链接。可以将多个文件或目录打包成一个单独的文件,通常以 .tar 扩展名结尾
-c
:创建新的归档文件。-x
:从归档文件中提取文件。-v
:显示详细的操作信息。-f
:指定归档文件的名称。-z
:使用 gzip 压缩算法进行压缩。生成的打包文件将具有.tar.gz
扩展名-p
:保留原来的文件权限与属性
tar -cvf archive.tar file1 file2
创建一个名为archive.tar
的归档文件,包含file1
和file2
tar -czvf archive.tar.gz file1 file2
创建一个名为 archive.tar.gz
的压缩文件,其中包含 file1
和 file2
gzip压缩
对单个文件进行压缩,并生成.gz
格式的压缩文件。gzip
命令通常与tar
命令结合使用,以实现对文件和目录的打包和压缩操作。
-c
:将压缩后的数据输出到标准输出,而不修改原始文件。-d
:解压缩文件。-v
:显示详细的操作信息。
gzip file1
对文件file1
进行压缩,生成file1.gz
zip打包和压缩
对于在Linux中传递的压缩文件,不要使用zip
打包和压缩,因为 7z 和 zip 压缩格式都不能保留 unix 风格的文件权限,比如解压出一个可执行文件,需要重新 chmod chown
才能恢复正常。
zip可以创建包含多个文件和目录的压缩文件。常见的zip命令选项如下:
-r
:递归地压缩目录及其子目录中的文件。-q
:静默模式,不显示压缩过程的输出信息。-9
:最高压缩级别,生成更小的压缩文件。-d
:从压缩文件中删除指定的文件。-u
:更新压缩文件中已存在的文件。