Linux基础之文件管理

“Linux下一切皆文件!”

Everything is a file 是一个经典的概念。Linux系统将所有的东西都看作是文件,包括将硬件设备、进程、网络连接等均抽象为文件。

这也就意味着,用户可以使用同样的命令和工具来操作硬件设备和文件。比如使用cat命令可以读取一个普通文件,也可以读取键盘上输入的字符。

文件权限

文件权限是通过一系列权限位来管理的,这些权限位决定了文件对用户、组和其他用户的可读、可写和可执行权限。每个文件都有一个所有者和一个所属组。

文件权限包括读、写和执行权限:

  • 读权限(r):允许用户读取文件的内容或列出目录的内容

  • 写权限(w):允许用户修改文件的内容或在目录中创建、删除和重命名文件

  • 执行权限(x):允许用户执行文件,或允许用户进入目录

文件权限共有九个位,分为三组,每组三个位,分别为:

  • 所有者权限:指定文件所有者的权限

  • 所属组权限:指定文件所属组的权限

  • 其他用户权限:指定除所有者和所属组以外的其他用户的权限

举个例子:

drwxr-xr-x. 2 root root 34 Jul 14 20:59 tmp

从左向右依次分析:

  • d 表示文件类型为一个目录,而不是普通文件

  • drwxr-xr-x. 文件权限总共10个字符,r可读,w可写,x可执行,-没有对应权限

    第一组 rwx 文件拥有者的权限

    第二组 r-x 文件所属组的权限

    第三组 r-x 以上两者以外的用户或者组的权限

    . 文件的扩展权限,可以针对的对某些用户或者用户组设置权限

  • 2 表示此目录下的子项数量(包括 ./ 和 /..)

  • root 文件的所属用户

  • root 文件所属的用户组

  • 34:文件大小(以字节为单位)

  • Jul 14 20:59 文件的最后修改时间

  • tmp 文件名

文件的三个时间戳

在Linux系统中每个文件都有三个时间戳,用于记录不同的时间:

  • atime(access time):文件最近一次被访问或读取的时间。当使用cat、less 或 more 来读取文件,访问时间会更新。

  • mtime(modification time):文件内容最后一次被修改的时间。当编辑文件并保存时,修改时间会更新。

  • ctime(change time):文件的文件元数据被修改的时间。当文件的所有者、权限或其他元数据发生变化时,文件的更改时间会更新。

stat 命令可以查看文件的详细信息:

创建文件

touch 命令可以用来创建空文件,语法格式为:touch [OPTION]... FILE...

使用 touch 命令创建空文件:

touch filename.txt

如果文件已存在,还可以使用 touch 命令来更新文件的时间戳:

touch -a # 修改文件的访问时间

touch -m # 修改文件的 mtime

创建多个普通文件:

touch file1.txt file2.txt file3.txt

其他命令包括 echo、cat、vim 等都可以创建新文件。

创建目录

mkdir 命令用来创建目录, 语法格式为:[OPTION]... DIRECTORY...

  • -p 可快速创建目录的同时创建必要的父目录,对于已存在的目录不会被覆盖

  • -v 显示创建目录的详细过程

mkdir -v directory

mkdir directory1 directory2 directory3 # 一次创建多个目录

mkdir -p parent/child # 创建多级目录

删除文件

rm 命令用来删除文件或目录,语法格式为:[OPTION]... [FILE]...

删除文件:

rm filename.txt # 删除单个文件

rm file1.txt file2.txt file3.txt # 删除多个文件

删除目录及其内容:

如果要删除一个目录及其所有内容,可以使用 -r 参数来递归删除。

rm -r directoryname

-f 表示强制删除,文件处于锁定状态或者你没有足够的权限也会删除。

文件的移动与复制

mv 命令用来移动或重命名文件,语法格式为:mv [OPTION]... SOURCE... DIRECTORY

移动文件到新位置:

mv sourcefile.txt /path/to/destination/

重命名文件:

当要移动的文件移动路径没有发生变化,只有文件名发生了变化,那就相当于修改文件名。

mv oldfilename.txt newfilename.txt

当oldfilename.txt和newfilename.txt都是普通文件时,并且newfilename.txt存在,那么文件newfilename.txt将会被oldfilename.txt替代。

当mv后面的参数多于2的时候,表示最后一个文件之前的所有文件都会被移动到最后一个文件中,最后最后一个是文件夹那么命令执行成功,如果最后一个文件是普通文件那么失败。

cp 命令,用来复制文件或者目录,语法格式为:cp [OPTION]... SOURCE... DIRECTORY

复制文件到目标位置:

cp sourcefile.txt /path/to/destination/

在同一目录下复制并重命名文件:

cp oldfile.txt newfile.txt

递归复制目录及其内容:

cp -r sourcedirectory/ /path/to/destination/

使用 -r 参数来递归复制整个目录 sourcedirectory 及其内容到 /path/to/destination/

文件查看与编辑

查看文件内容:

  • cat 显示文件的全部内容,适合看相对较短文档 -n 选项可以增添行号

  • tac 它是 cat 逆向显示

  • head 查看文件的开头几行,-n 表示显示多少内容 head n-m 表示区间显示 n-m 行的内容

  • more 以逐页方式查看文件内容,显示读取进度,当文档读取完毕的时候自动退出

  • less 以交互式方式查看文件内容,如果要退出文档需要使用快捷键q

  • tail 查看文件的末尾几行,常用于查看更新频繁的日志等,-n 表示读取尾部的行数 -f 表示实时更新

  • hexdump 对二进制文件或非文本文件以十六进制格式查看,hexdump -C filename

编辑文件:

  • echo 将文本重定向到文件中:echo "Hello, world!" > filename.txt

  • printf 也可以将文本重定向到文件中:printf "Hello, world!\n" > filename.txt

  • vim 一款强大的文本编辑器

VIM

在于 vim 编辑器中设置了三种模式:命令模式、末行模式、编辑模式

命令模式

按键 功能
↑ ↓ ← → 光标按单个字符上下左右移动
w 光标按照单词向后跳转
b 光标按照单词向前跳转
^ 光标跳转至行首
$ 光标跳转至行尾
gg 文档首行第一个字符
G 文档最后一行第一个字符
ngg/nG 跳转到指定n行
yy 复制光标所在行
nyy 复制从光标处开始的n行
p 将缓冲区的内容粘贴到光标所在行的下一行
P 将缓冲区的内容粘贴到光标所在行的上一行
dd 删除光标所在行
ndd 删除从光标处开始的n行
d^ 删除光标前至行首字符
d$ 删除光标及之后的所有字符
u 撤销操作

编辑模式

按键 功能
i 在光标前插入
I 在光标所在行行首第一个非空字符前插入
a 在光标后插入
A 在光标所在行末尾插入
o 在光标所在行下一行插入
O 在光标所在行上一行插入
s 删除光标所在字符并进入插入模式
S 删除当前行并进入插入模式

末行模式

按键 功能
:q 退出,未对文件做任何编辑操作才可退出
:q! 强制退出,不保存文档内容
:w 保存文件
:w /dir/file 将文件另存为/dir/file
:wq 保存文件内容并退出
:wq! 强制保存并退出
:/word 从上而下在文件中查找字符串“word”(可按n键定位到下一个匹配的被查找字符串)
:r /dir/file 在当前文件中读入其他文件内容
:g/word/d 查找含有"word"的行并删除
:set nu 显示行号
:set nonu 关闭行号显示
:n1,n2 d 删除n1-n2行内容
:n1,n2 co n 复制n1-n2行到第n行后面

重定向

数据流

  • 标准输入(standard input 简称stdin):默认情况下,标准输入指从键盘获取的输入,代码为0
  • 标准输出(standard output 简称stdout):默认情况下,命令执行所回传正确的信息会输出到屏幕上,代码为1
  • 标准错误输出(standard error output stderr):默认情况下,命令执行失败后,所回传的错误信息会输出到屏幕上,代码为2

重定向操作符

重定向操作符可以将命令输入和输出数据流从默认设备重定向到其他位置。

  • 使用 > 或者 1> 可以将标准输出的结果以覆盖的方式写入到指定文件中

  • 使用 2> 可以将报错信息输出的结果以覆盖的方式写入到指定文件中

  • 使用 2>/dev/null 表示将错误信息抛弃

  • 使用 &> 可以将stdin、stderr一起输出的结果以覆盖的方式写入到指定文件中

  • 使用 >> 将命令执行后的正确输出信息以追加的方式写入到指定的文件中,不覆盖原文件内容

  • 使用 < 使命令从指定的文件中读取数据作为输入

  • 使用 << 结束标识字符串,在命令行读取数据作为输入,直到遇到指定的结束标识字符串

  • 管道符 | 将管道符左侧命令结果以参数的形式给到右侧命令

  • tee 指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时输出到文件。

查看文件详细信息

wc 命令查看普通文件详情信息,包括大小、有多少个单词、有多少行

  • -l 表示查看文件有多少行

  • -w 表示查看文件中有多少个单词

  • -c 表示查看文件有多少个字符

du 命令统计当前文件中的空间占用情况,会列出每一个文件夹中文件/文件夹的占用情况

  • -a 会递归的显示文件夹下所有的文件中占用情况(包括子目录)

  • -s 会将文件的占用情况汇总展示

查找文件

Whereis 命令用于查找特定命令的二进制文件、源代码文件以及 man 手册文件的路径。

which 命令用于确定在系统路径中执行的特定命令的位置。

find 按照指定的条件在指定的路径下递归搜索文件。

搜索特定名称的文件:

find /path/to/search -name filename.txt

搜索特定类型的文件:

find /path/to/search -type f

搜索特定大小的文件:

# find 搜索路径 -size +10k/-10k

find /path/to/search -size +10M

搜索特定权限的文件:

find /path/to/search -perm 644

执行其他操作,如删除或执行命令:

find /path/to/search -name "*.tmp" -exec rm {} \;

根据所有者组属性查找:

#find 搜索路径 -uid -gid -user -group -nouse

find /path/to/search -uid 0

find /home -user smileleooo

文件属性的管理

文件属性修改

chattr (change Attribute),文件属性可以用来增强文件的安全性和稳定性,以防止意外删除或修改文件。

常用的文件属性包括:

  • -a 只允许在文件末尾添加内容,不允许修改或删除已有内容

  • -i 让文件只有可读属性,防止文件被删除、重命名、修改或链接

其中:+ - = 分别表示添加、移除、设置属性。

例如:

chattr +i filename

# 让文件只有可读属性

使用chattr命令需要root权限。若要查看文件的属性,可以使用lsattr命令。

修改文件的用户和组

chown (change owner),改变文件或目录的所有者和用户组。

  • 只改用户:chown 新所有者 文件或目录

  • 用户和组都改:chown 新所有者:新用户组 文件或目录

例如:

sudo chown smileleooo:users filename

# 将文件的所有者更改为smileleooo,用户组更改为users,

文件的压缩和解压缩

tar 是一个用于创建和提取归档文件的命令行工具,通常用于将多个文件和目录组合成一个单一的归档文件。

参数:

  • -c 创建新的归档文件

  • -x 提取归档文件中的内容

  • -t 查看归档文件中的内容

  • -v 详细模式,显示操作过程中的详细信息

  • -f 指定归档文件的名称

  • -z 使用 gzip 压缩/解压缩归档文件

归档文件

创建 tar 归档文件:

# 将文件 file1、file2 和目录 directory 归档到一个名为 archive.tar 的文件中

tar -cvf archive.tar file1 file2 directory

查看 tar 归档文件中的内容:

# 列出 archive.tar 中的所有文件和目录

tar -tvf archive.tar

提取 tar 归档文件中的内容:

提取 archive.tar 中的所有文件和目录到当前目录

tar -xvf archive.tar

压缩和解压缩

压缩 tar 归档文件为 gzip 格式:

tar -czvf archive.tar.gz file1 file2 directory

解压缩 gzip 格式的 tar 归档文件:

tar -xzvf archive.tar.gz

文件的传输

SCP(Secure Copy Protocol),SCP 是一种基于 SSH 的安全文件传输协议,可以用于在远程主机之间传输文件。

传输文件到远程主机:

# scp 本地文件 用户名@远程主机:远程目录

scp file.txt user@remote_host:/home/user/

从远程主机下载文件:

# scp 用户名@远程主机:远程文件 本地目录

scp user@remote_host:/home/user/file.txt .

包括还有其他的,比如rsync、ftp、sftp等。


若有错误,欢迎指正!o( ̄▽ ̄)ブ

热门相关:九龙神鼎   全能千金燃翻天   顶级气运,悄悄修炼千年   重生田园贵媛:名门暖婚   我的女友是丧尸