Linux文件管理命令

Posted by Wh0ami-hy on September 26, 2023

1. 文件目录结构

标准目录结构

以下结构几乎适用于所有Linux系统

  • boot 文件中存放的是和启动相关的内容
  • dev 文件存放的是设备相关内容,如硬盘、光盘、null 等
  • etc 文件是用来存放一些重要的配置文件,它的作用基本等价于 windows 系统中注册表的作用。因此管理 linux 主要就是在改 etc 中的各种设置
  • home 文件存放的是用户的数据
  • run 文件存放的是运行中生成的相关数据
  • bin(binary) 文件存放的是用户可执行的二进制文件,而 sbin 文件存放的是系统管理员常用的工具
  • tmp 文件是用来存放临时数据
  • usr 文件存放的是大型的数据
  • var 文件存放的是可变的内容,如日志、缓存数据等

QQ图片20240825131138

文件系统

  • 文件和目录被组织成一个单根倒置树结构
  • 文件系统从根目录下开始,用/表示
  • 根文件系统(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管道文件pipe
  • s套接字文件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 按文件后缀排序

QQ图片20240825130630

文件的三个时间

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 | command2command1 |& 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的归档文件,包含file1file2

tar -czvf archive.tar.gz file1 file2 创建一个名为 archive.tar.gz 的压缩文件,其中包含 file1file2

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:更新压缩文件中已存在的文件。

本站总访问量