《鸟哥的Linux私房菜基础篇》---2 Linux的档案与目录
目录
一、Linux的档案权限与目录配置
1、档案的权限
2、改变文件属性和权限
3、目录配置
二、Linux基本指令学习
1、相对路径和绝对路径
2、时间显示:date、cal、cal
3、档案权限:chgrp、chown、chmod
4、目录与路径:cd、pwd、mkdir、rmdir、$PATH
5、档案与目录管理:ls、cp、rm、mv
6、档案内容查阅:cat、tac、nl、more、less、head、tail、od、touch
7、档案与目录的默认权限与隐藏权限:umask、chattr、lsattr、SUID、SGID、SBIT、权限设定、file
8、指令与档案的搜寻:which、whereis、locate、find
9、极重要!权限与指令间的关系
一、Linux的档案权限与目录配置
1、档案的权限
在Linux系统中,每个档案都有一组权限,用于控制谁可以读取、写入或执行该档案。这些权限可以通过ls -al
命令来查看,输出结果的第一栏表示档案的类型与权限。
ls -al
ls -l
[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ]
[ 权限 ][连结][拥有者][群组][档案容量][ 修改日期 ][ 檔名 ]
[1] 档案类型:
[d]
:表示目录。
[-]
:表示普通档案。
[l]
:表示链接档。
[b]
:表示装置文件里面的可供存储的接口设备。
[c]
:表示装置文件里面的串行端口设备,例如键盘、鼠标等。
[2] 权限:
按照身份类权限的类别有:使用者、群组、其他人
接下来的字符以三个为一组,且都是[rwx]
,分别代表可读(read)、可写(write)、可执行(execute)的权限。如果没有相应的权限,则用[-]
表示。
第一组:档案拥有者的权限。
第二组:同群组的权限。
第三组:其他非本群组的权限。
2、改变文件属性和权限
(1)改变所属群组:使用chgrp
命令。
例如,chgrp 组名 档案名
。要改变的组名必须在/etc/group
文件中存在。
(2)改变档案拥有者:使用chown
命令。
例如,chown 账号名称 档案或目录
。要改变的用户必须在/etc/passwd
文件中存在。如果希望同时改变群组,可以使用chown 账号名称:组名 档案或目录
。此外,使用-R
选项可以递归地改变目录下所有次目录或档案的权限。
(3)改变权限:使用chmod
命令。
权限设定的方案有两种:数字法和符号法。
A、数字法:例如,chmod 777 档案名
表示设置档案的拥有者、同群组用户以及其他用户都具有可读、可写、可执行的权限。数字7是由可读(4)+可写(2)+可执行(1)得出的。
B、符号法:例如,chmod u=rwx,go=rx 档案名
表示设置档案的拥有者具有可读、可写、可执行的权限,而同群组用户和其他用户则具有可读和可执行的权限。
3、目录配置
Linux系统的目录配置通常遵循文件系统层次结构标准(FHS),该标准定义了Linux系统中目录的结构和用途。以下是Linux系统中一些主要目录的配置及其作用:
(1)根目录(/)
作用:根目录是整个目录树的起点,所有其他目录都是从根目录衍生出来的。它与启动、还原、系统修复等操作有关。
建议:FHS标准建议根目录所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在一个分区。
相对比较重要的是:
/etc(配置文件);
/bin(一般身份可用执行文件);
/dev(装置档案);
/lib(执行档的函式库戒核心模块等);
/sbin(系统管理员可用指令);
/home(用户家目彔);
/usr(软件资源):
/var(变劢幅度较大的数据);
/tmp(系统暂存,数据莫名)
二、Linux基本指令学习
1、相对路径和绝对路径
(1)绝对路径:路径的写法【一定由根目录 / 写起】,例如: /usr/share/doc 这个目录。
(2)相对路径:路径的写法【不是由 / 写起】,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: 【cd ../man】这就是相对路径的写法啦!相对路径意指【相对于目前工作目录的路径!】
特殊的目录表示:
. 代表此层目录.. 代表上一曾目录- 代表前一个工作目录~ 代表【目前用户身份】所在的家目录
~ account 代表account 这个用户的家目录(accout)是个账号名称注意:根目录(/)的上一层(..)与根目录自己(.)是同一个目录
2、时间显示:date、cal、cal
(1)date 时间日期
(2)cal 日历(caldener)
(3)bc 基本计算(basic calculator)
3、档案权限:chgrp、chown、chmod
需要了解下面的含义:
(1)符号表示法使用以下符号:
u:文件或目录的所有者(user)
g:文件或目录的所属组(group)
o:其他用户(others)
a:所有用户(all),等同于 ugo
(2)操作符:
+:添加权限
-:移除权限
=:设置权限(覆盖原有权限)
(3)权限类型:
r:读取权限(read)
w:写入权限(write)
x:执行权限(execute)
(4)每个权限类型(读、写、执行)对应一个八进制值:
读(r):4
写(w):2
执行(x):1
(1)chgrp 改变档案所属群组
命令格式:chgrp [选项]... 组文件 或 chgrp [选项]... --reference=RFILE文件...
常用选项:
- -R:递归地更改指定目录及其内部文件和子目录的组所有权。
- --reference=RFILE:将文件的组所有权更改为与参考文件RFILE相同的组。
- -c:当发生改变时,输出调试信息。
- -f:取消除用法消息以外的所有错误消息。
- -v:运行时显示详细操作信息,描述对每个文件采取的操作或不操作。
- -H:如果命令行参数是目录的软链接,则遍历该链接(与-R选项一起使用时)。
- -L:遍历每一个软链接到遇到的目录(与-R选项一起使用时)。
- -P:不遍历任何软链接(默认行为,与-R选项一起使用时)。
使用示例:
// bash
//1、更改文件的组所有权
chgrp -R Ivy temp.txt
//2、递归更改文件夹及其所有内容的组所有权
chgrp -R Ivy GFG
//3、使用参考文件的组名更改另一个文件或文件夹的组
chgrp -R --reference=abc.txt GFG
(2)chown 改变档案拥有者
命令格式:chmod [选项] 文件名
使用示例:
// bash
/// 1、字母法示例
(1)增加文件所有用户组可执行权限
chmod a+x 文件名
该命令为文件的所有用户(all),都执行(x)权限。
(2)同时修改不同用户权限
chmod ug+w,o-x 文件名
该命令为文件的所有者(u)和所属组(g)增加了写(w)权限,同时删除了其他用户(o)的执行(x)权限。
(3)删除文件权限
chmod a-x 文件名
该命令删除了所有用户的执行(x)权限。
(4)使用“=”设置权限
chmod u=r 文件名
该命令撤销了文件原来的所有权限,然后为所有者(u)设置了读(r)权限。
(5)对一个目录及其子目录所有文件添加权限
chmod -R u+x 目录名
该命令递归地给指定目录下所有文件和子目录的所有者(u)分配执行(x)权限。
/// 2、数字法示例
数字法基于字母法,用数字表示不同的权限。其中,r(读权限)对应数字4,w(写权限)对应数字2,x(执行权限)对应数字1。权限值通过将这三种权限对应的数字相加得到,顺序是所有者(u)、所属组(g)、其他用户(o)。
(1)设置文件权限为读、写、执行
chmod 777 文件名
该命令为文件的所有者(u)、所属组(g)和其他用户(o)都设置了读(r)、写(w)、执行(x)权限。数字7是通过4(r)+2(w)+1(x)得到的。
(3)chmod 改变档案的权限
命令格式:chmod [选项] 模式 文件/目录
常用选项 -R 或 --recursive:递归地更改目录及其内容的权限。
1、符号表示法:
// 为所有者可以读、写、执行,所属组可以读、执行,其他用户可以读。
chmod u+rwx,g+rx,o+r myfile.txt
2、八进制表示法
//权限设置为 rwxr-xr-x,即所有者可以读、写、执行,所属组和其他用户可以读、执行。
chmod 755 myfile.txt
3、常用选项
//将 mydirectory 及其所有子目录和文件的权限设置为 rwxr-xr-x。
chmod -R 755 mydirectory
4、目录与路径:cd、pwd、mkdir、rmdir、$PATH
(1)cd 变换工作目录(change directory)
命令格式:cd [选项] [目录路径]
常用选项:
-L:如果目标目录是符号链接,则切换到链接所指向的目录(默认行为)。
-P:如果目标目录是符号链接,则切换到链接所指向的实际物理目录。
//切换到当前目录的上一级目录
cd ..
//连续切换多个目录(虽然不常见,但可以通过空格分隔实现)
cd /usr/local/bin
//返回上次访问的目录
cd -
//切换到带有空格的目录
cd "my directory"
cd 'my directory'
cd my\ directory
(2)pwd 显示目前所在目录(print working directory)
命令格式:pwd [选项]
常用选项:
-L:显示逻辑路径,即包含符号链接(软链接)的路径。这是pwd命令的默认行为。
-P:显示物理路径,即实际文件或目录的路径,不解析符号链接。
--help:显示pwd命令的帮助信息,包括如何使用和可用的选项。
--version:显示pwd命令的版本信息。
//返回了当前工作目录的逻辑路径,即包含符号链接的路径(如果有的话)
$ pwd
/home/user/documents
//假设/home/user是一个符号链接,它指向/mnt/storage/user。
//在此,pwd -P 命令返回了当前工作目录的物理路径,即不解析符号链接的实际路径。
$ pwd -P
/mnt/storage/user/documents
//在Shell脚本中,可以使用pwd命令来确定脚本运行时所在的工作目录
#!/bin/bash
current_dir=$(pwd)
echo "当前脚本的工作目录是: $current_dir"
注意事项:
A、pwd命令返回的是当前工作目录的绝对路径,而不是相对路径。
B、当使用符号链接时,pwd命令的默认行为是显示逻辑路径。如果需要显示物理路径,可以使用-P选项。
(3)mkdir 建立新目录
命令格式:mkdir [选项] 目录名称
常用选项:
- -p:递归地创建目录。如果指定的目录的上级目录不存在,则会递归地创建它们。这对于创建多级目录结构非常有用。
- -m 或 --mode:设置新创建目录的权限(八进制数)。这允许用户手动配置目录的权限,而不是使用默认的权限。
- -v 或 --verbose:显示创建的目录的详细信息。这包括每个创建的目录的权限、所有者和群组等信息。
- -Z:为新创建的目录设置SELinux上下文。这对于需要SELinux支持的程序或服务来说是有用的。
- --parents:与-p选项类似,用于递归地创建目录,但不会设置新目录的权限(默认为777)。这个选项通常与-m选项一起使用。
- --no-clobber:如果指定的目录已经存在,则不覆盖它并显示错误消息。默认情况下,如果目录已经存在,mkdir会覆盖它并显示警告消息(但实际上,mkdir命令在尝试创建已存在的目录时会直接报错,而不会覆盖已存在的目录)。
//创建单个目录
mkdir newdir
//创建多个目录
mkdir dir1 dir2 dir3
//创建多级目录
mkdir -p dir1/dir2/dir3
//设置目录权限
mkdir -m 755 mydir
//显示详细信息
mkdir -v mydir
(4)rmdir 删除空的目录
命令格式:rmdir [选项] 目录名
常用选项:
- -p 或 --parents:递归地删除目录及其上级空目录。如果删除后目录的上级目录也为空,则继续删除上级目录,直到遇到非空目录为止。
- -v 或 --verbose:显示删除的目录名称。在删除每个目录时,rmdir会输出一条消息,确认该目录已被成功删除。
- --ignore-fail-on-non-empty:在尝试删除非空目录时,此选项会使rmdir不报错并继续执行。但请注意,这并不会实际删除非空目录,只是忽略了删除非空目录时的错误消息。
//删除单个空目录
rmdir newdir
//删除多个空目录
rmdir dir1 dir2 dir3
//递归删除多级空目录
rmdir -p dir1/dir2/dir3
//显示删除的目录名称
rmdir -v mydir
(5)$PATH 关于执行文件路径的变量
$PATH 是一个至关重要的环境变量,它指定了系统在命令中搜索可执行文件的路径。
作用:
A、 定义搜索路径:$PATH是一个由冒号分隔的路径列表,每个路径都指向一个包含可执行文件的目录。当用户在命令行中输入一个命令时,系统会按照$PATH中列出的路径顺序搜索该命令的可执行文件。
B、提高命令执行效率:通过将常用的可执行程序所在的路径添加到$PATH中,用户可以在任何位置快速访问和执行这些程序,而无需指定完整的路径。
临时修改:
只对当前会话有效,当关闭终端或注销时,将失效。
// 该命令将/new/path添加到$PATH的开头。也可以将/new/path替换为其他想要添加的路径,多个路径之间使用冒号分隔。
export PATH=/new/path:$PATH
永久修改:
要永久修改$PATH环境变量的值,需要编辑用户的配置文件。常见的配置文件包括~/.bashrc、~/.bash_profile、~/.profile等。
以下是永久修改$PATH的步骤:
A、确定环境文件:首先,确定你的环境文件。一般情况下,如果你使用的是Bash shell,环境文件应该是~/.bashrc或~/.bash_profile。
B、打开环境文件:使用文本编辑器打开环境文件。例如,如果环境文件是~/.bashrc,可以执行以下命令:
C、保存修改:保存对环境文件的修改,然后退出文本编辑器。在Nano编辑器中,可以按下“Ctrl + O”键保存文件,然后按下“Ctrl + X”键退出编辑器。
D、使修改生效:要使对环境文件的修改生效,可以注销当前会话或运行以下命令:
1) 设置$PATH:在打开的环境文件中,找到类似以下行的代码
nano ~/.bashrc
2)这行代码定义了当前的$PATH变量。在这行代码的末尾添加自定义路径,使用冒号分隔。例如,如果要将/new/path添加到$PATH中,可以将代码修改为:
//export PATH=/existing/paths:$PATH
export PATH=/existing/paths:/new/path:$PATH
//请注意,/existing/paths是现有的$PATH路径。确保在添加新路径时保留现有路径。
3)C、D
该命令将重新加载~/.bashrc文件,并使修改后的$PATH生效。
source ~/.bashrc
5、档案与目录管理:ls、cp、rm、mv
(1)ls 档案与目录的检视
命令格式:ls [选项]
常用的 ls 命令选项:
1)基本选项:
-a:显示所有文件,包括以点(.)开头的隐藏文件。
-l:使用长格式显示目录内容,包括文件权限、所有者、大小和修改时间等信息。
-h:以人类可读的格式显示文件大小(如 KB、MB)。
2)组合选项:
-la:结合 -l 和 -a,显示所有文件的详细信息,包括隐藏文件。
-lh:结合 -l 和 -h,以长格式和人类可读的格式显示文件信息。
3)排序和逆序:
-t:按修改时间排序,从最近到最远。
-r:逆序显示目录内容。
-S:按文件大小排序,从大到小。
-R 或 --recursive:递归列出目录内容。
4)文件类型和信息:
-F:在文件名后添加斜杠(/)表示目录,星号(*)表示可执行文件,以及其他符号表示不同类型的文件。
-i:在文件名前显示 inode 号。
-d:仅列出目录名,而不列出其内容(可以与其他选项结合使用,如 -ld)。
5)数值和权限:
-n 或 --numeric-ids:显示文件权限的数字表示,而不是用户名和组名。
-p:在目录名后添加斜杠(/)。
6)其他选项:
-v:自然排序(按数字顺序和字母顺序)。
-c:按文件状态改变时间排序。
-u:按文件访问时间排序。
-X:按文件扩展名排序。
-1:每行只显示一个文件(单列输出)。
--color:使用颜色区分不同类型的文件(通常是默认启用的)。
--time-style:指定时间格式(如 +FORMAT 或 full-iso)。
7)帮助和版本:
--help:显示帮助信息。
--version:显示 ls 命令的版本信息。
常用的:
//显示当前目录的文件名
ls
//显示当前目录的文件详细信息,包括隐藏文件
ls -l
//很多distribution在预设情况下,ls -l 等同于 ll
ll
(2)cp 复制档案或目录
命令格式:cp [选项] 源文件 目标文件
常用选项
-r或-R:递归复制目录及其内容。当要复制的源文件是一个目录时,若不使用该选项,只会复制目录本身而不会复制其中的文件和子目录。
-i:如果目标文件已经存在,询问是否覆盖。当你想要避免不小心覆盖已有文件时,可以使用此选项。
-l:创建硬链接而不是复制文件。硬链接是多个文件共享同一块磁盘空间,修改一个文件会影响到其他所有硬链接。这在磁盘空间有限的情况下非常有用。
-s:创建符号链接而不是复制文件。符号链接是一个指向源文件的特殊文件,类似于Windows系统中的快捷方式。
-u:仅复制源文件不存在或目标文件较旧的文件。这通常用于增量备份或更新文件。
-a:归档模式,保留源文件的所有属性,包括所有权、时间戳和权限。这通常用于需要保持文件完整性的场景。
-v:显示详细的复制进度。这可以在复制大量文件时提供更多的信息。
-n:不覆盖已经存在的目标文件。这用于避免意外覆盖文件。
-P:复制符号链接的源文件而不是符号链接本身。
--preserve:保留源文件的所有属性,包括所有权、时间戳和权限。这是-a选项的另一种表示方式。
--remove-destination:在复制前删除目标文件。这用于确保每次复制都是全新的。
--parents:保留源文件的路径结构。当你需要复制文件到一个具有相同目录结构的目标目录时,这个选项非常有用。
--sparse:对于稀疏文件进行稀疏复制,即只复制已经被使用的磁盘块。
--reflink[=WHEN]:创建引用副本,即新文件与源文件共享相同的磁盘空间,只有在修改其中一个文件时才会分配独立的空间。
--backup[=CONTROL]:在复制之前进行备份。该选项用于指定备份的控制方式。
常用:
//归档模式,保留源文件的所有属性,包括所有权、时间戳和权限。
//这通常用于需要保持文件完整性的场景。
cp -a
//复制符号链接的源文件而不是符号链接本身
cp -P
(3)rm 移除档案或目录
命令格式:rm [选项] 档案或目录
常用选项:
-f:强制删除文件或目录,不提示任何确认信息。即使文件或目录不存在,也不会显示错误。
-i:交互模式,在删除每个文件或目录之前都会提示用户确认。这有助于防止误删重要文件。
-r或-R:递归删除目录及其所有子目录和文件。如果不使用此选项,rm命令将只能删除空目录或单个文件。(非常危险的选项!!!)
//删除单个文件
rm file.txt
//删除多个文件
rm file1.txt file2.txt file3.txt
//递归删除目录及其内容
rm -r /path/to/directory
//强制删除文件
rm -f file.txt
(4)mv 移动档案与目录,或更名
命令格式:mv [选项] 源文件或目录 目标文件或目录
常用选项:
-i:交互模式,在覆盖文件之前提示用户确认。这有助于防止误覆盖重要文件。
-f:强制模式,即使目标文件或目录存在也不提示,直接覆盖或移动。
-u:只在源文件比目标文件新,或当目标文件不存在时,才移动或重命名源文件。
功能说明:
1)移动文件或目录:
当目标参数是目录时,源文件或目录会被移动到该目录下。
可以移动多个文件或目录到同一个目标目录中。
2)重命名文件或目录:
当目标参数不是目录而是文件时,源文件会被重命名为目标文件名。
此时,源文件只能有一个(也可以是源目录名),且目标文件不能是已存在的目录。
3)覆盖文件:
默认情况下,如果目标文件已存在,mv命令会提示用户是否覆盖。
使用 -f 选项可以强制覆盖目标文件而不提示。
使用 -i 选项可以在覆盖之前提示用户确认。
示例:
//重命名文件:把oldfile.txt重命名为newfile.txt
mv oldfile.txt newfile.txt
//移动文件到目录:把file.txt移动到/path/to/directory/目录下
mv file.txt /path/to/directory/
//移动并重命名文件
mv file.txt /path/to/directory/newfile.txt
//移动多个文件到目录
mv file1.txt file2.txt /path/to/directory/
//重命名目录
mv olddir/ newdir/
//强制覆盖文件:如果/path/to/directory/下已存在同名文件,这将强制覆盖它而不提示
mv -f file.txt /path/to/directory/
(5)取得路径的文件名与目录名称
利用斜线 (/) 来分辨,有/是目录名称,反之是文件名。
6、档案内容查阅:cat、tac、nl、more、less、head、tail、od、touch
cat : 由第一行开始显示档案内容tac: 从最后一行开始显示,可以看出 tac 是 cat 的 倒着写!nl: 显示的时候,顺道输出行号!more: 一页一页的显示档案内容less: 不 more 类似,但是比 more 更好的是,他可以往前翻页!head :只 看头几行tail : 只 看尾巳几行od : 以二迚制的方式读取档案内容!touch:创建空文件或者更新文件的时间戳
(1)cat
命令格式:cat [选项] 文件名
常用选项:
-A:相当于-vET的整合选项,可列出一些特殊字符而不是空白而已;
-b:列出行号,仅针对非空白做行号显示,空白行不标行号;
-E:将结尾的断行字符$ 显示出来;
-n:打印出行号,连同空白行也会有行号,不-b 的选项不同;
-T:将[tab] 按键以^I 显示出来;
-v :列出一些看不出来的特殊字符。
示例:
//显示内容
cat text.txt
//显示行号+内容
cat -n text.txt
cat -b text.txt
(2)tac (反向列示,和cat刚好相反)
(3)nl 添加行号打印
命令格式:nl [选项] 档案
常用选项:
-b :指定行号指定的方式,主要有两种:
-b a :表示丌讳是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行丌要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段癿占用癿位数
示例:
//列出内容
nl text.txt
//加上行号
nl -b a text.txt
//加上行号,行号前面补上0(预设字段为六位数)
nl -b a -n rz text.txt
//加上行号,行号前面补上0(预设字段改为3)
nl -b a -n rz -w 3 text.txt
(4)more 一页一页翻动
命令格式:more 文件名
输入的指令有:
空格键(space):代表向下翻一页;
Enter:代表向下翻『一行』;
/字符串:代表在这个显示的内容当中,向下搜寻『字符串』这个关键词;
:f :立刻显示出文件名以及目前显示的行数;
q :代表立刻离开more ,不再显示该档案内容。
b 或[ctrl]-b :代表往回翻页,丌过这劢作叧对档案有用,对管线无用。
(5)less 一页一页翻动
命令格式:less 文件名
输入的指令有:
空格键 :向下翻劢一页;
[pagedown]:向下翻劢一页;
[pageup] :向上翻劢一页;
/字符串 :向下搜寻『字符串』的功能;
?字符串 :向上搜寻『字符串』癿功能;
n :重复前一个搜寻 (不 / 或? 有关!)
N :反向的重复前一个搜寻 (不 / 或 ? 有关!)
q :离开 less 这个程序;
(6)head 取出前面几行
命令格式:head [-n number] 档案
-n :后面接数字,代表显示几行的意思,默认显示前面10行
//默认显示前面10行
head -n text.txt
//显示前面100行
head -n 100 text.txt
(7)tail 取出后面几行
命令格式:tail [-n number] 档案
选项与参数:
-n :后面接数字,代表显示几行的意思,默认显示前面10行
-f :表示持续侦测后面所接的档名,要等到按下[ctrl] -c 才会结束tail的侦测
//默认显示后面10行
tail -n text.txt
//显示后面100行
tail-n 100 text.txt
//持续侦测text.txt的内容
tail -f text.txt
<==要等到输入[crtl]-c 之后才会离开 tail 这个指令的侦测!
案件示例:
假如我想要显示 text.txt 的第 11 到第 20 行呢?
思考:在第 11 到第 20 行,那么我取前 20 行,再取后十行
head -n 20 text.txt | tail -n 10
(8)od
命令格式:od [选项] 文件名
常用选项
-a:以字符和十进制的形式显示文件数据。
-b:以八进制形式显示文件数据。
-c:以字符形式显示文件数据。
-d:以十进制形式显示文件数据。
-f:以浮点数形式显示文件数据。
-h:以十六进制形式显示文件数据(注意,某些版本的od命令中,-h选项可能不是以十六进制形式显示数据的标准选项,但通常od命令默认会以十六进制形式显示数据,且-x选项更明确地用于此目的)。然而,为了兼容性和明确性,建议使用-x选项来指定十六进制显示。
-o:以八进制形式显示文件数据(与-b选项相似,但-b选项更常用)。
-x:以十六进制形式显示文件数据,这是查看二进制数据时最常用的选项之一。
此外,还有一些其他选项可用于控制od命令的输出:
-A radix,--address-radix=radix:以radix进制打印文件的偏移量。radix可选的值有d(十进制)、o(八进制)、x(十六进制)、n(不打印偏移量),默认为八进制。
-j BYTES,--skip-bytes=BYTES:在格式化和写入之间跳过输入开头的BYTES字节。BYTES可以是整数,也可以是整数后面跟着单位(如b、KB、K、MB、M等),表示对应的大小。
-N BYTES,--read-bytes=BYTES:最多输出BYTES字节的输入。BYTES值与-j选项相同。
-t TYPE,--format=TYPE:指定输出文件数据的格式。TYPE可选的值包括a(命名字符,忽略高位)、c(可打印的单字节字符)、d(有符号十进制数)、f(浮点数)、o(八进制数)、u(无符号十进制数)、x(十六进制数)等。此外,还可以指定解析数字时使用的字节数或C编译器的内置数据类型(如char、short、int、long等)。
-v,--output-duplicates:输出相同的连续行。默认情况下,当两个或多个连续输出行相同时,od只输出第一行,并在下一行中添加星号以指示省略。
-w[n],--width[=n]:指定每个输出行输出的字节数。n必须是指定输出类型的大小的整数倍。如果没有提供此选项,则默认值为16(或某些版本中为32,具体取决于od命令的实现)。
使用示例:
//1、查看文件的十六进制数据:
od -x file.txt
//2、查看文件的八进制数据,并以字符形式显示:
od -b -c file.txt
//3、查看文件的十进制数据,并以浮点数形式显示:
od -d -f file.txt
//4、跳过前100个字节,并读取接下来的200个字节,以十六进制形式显示:
od -x -j 100 -N 200 file.txt
(9)touch 创建空文件或更新文件的时间戳
如果指定的文件不存在,就会创建,要是已经存在,则更新文件的访问时间。
命令格式:touch [选项] 文件名
常用选项
-a:仅改变文件的访问时间(Access time)。
-c 或 --no-create:如果文件不存在,则不创建文件。这个选项可以避免在文件不存在时无意中创建新文件。
-d:使用指定的日期时间,而非现在的时间来更新文件的时间戳。日期字符串可以使用多种格式,如YYYY-MM-DD HH:MM:SS。
-m:仅改变文件的修改时间(Modify time)。
-r:使用指定文件的时间信息(访问时间和修改时间)来更新目标文件的时间戳。
-t:使用指定的时间值来设置文件的时间戳。时间值的格式为[[CC]YY]MMDDhhmm[.ss],其中CC是世纪(可选),YY是年份的后两位,MM是月份,DD是日期,hh是小时,mm是分钟,ss是秒(可选)。
使用示例:
//1、创建空文件
touch file.txt
//2、更新文件的访问时间和修改时间,如果text.txt存在,则更新时间
touch text.txt
//3、仅改变文件的访问时间
touch -a text.txt
//4、使用指定的日期时间更新文件的时间戳
touch -d "2024-10-16 10:00:00" text.txt
//5、复制其他文件的时间戳
touch -r text.txt file.txt
//6、使用指定的时间值设置文件的时间戳
touch -t 202410161000.00 file.txt
7、档案与目录的默认权限与隐藏权限:umask、chattr、lsattr、SUID、SGID、SBIT、权限设定、file
umas(1)umask 档案预设权限k命令用于设置文件和目录创建时的权限屏蔽位,即决定新建文件和目录的默认权限。通过umask命令,可以灵活地控制文件和目录的权限,以提高系统的安全性和可用性
命令格式:umask [选项] [MODE]
选项是可选的,通常不使用;MODE表示要设置的权限掩码,可以使用数字形式或符号来表示。
umask值对新建文件和目录权限的影响:
1)新建文件:默认权限为666(即rw-rw-rw),然后减去umask值得到实际权限,如果减去后的结果中有执行权限(x),则需要将其加一。(这是出于安全性考虑,文件的执行权限不能通过权限掩码直接设置)
2)新建目录:默认权限为777(即rwxrwxrwx),然后减去umask值得到实际权限。
使用示例:
//1、查看umask值
umask
//假设返回值为0022,表示新文件和目录的默认权限将受到这个掩码的限制
//2、查看umask值,-S
umask -S
//输出:u=rwx,g=rwx,o=rx
//3、设置新的umask值
umask 002
//这将把umask值设置为002,新创建的文件和目录的默认权限将相应地改变。
(2)chattr 配置文件案隐藏属性
档案隐藏属性:除了9个权限,还有隐藏属性。
命令格式:chattr [选项] [+-=] [属性] 档案或目录名称
常用选项包括:
-R:递归地修改目录以及其下内容的属性。
-V:详尽地给出chattr的输出信息并打印出程序的版本。
-v:设置文件系统的版本(此选项不常用)。
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :设定一定,0仅有后面接的参数
常用属性包括:
i:设置文件为不可修改属性,即使是root用户也无法删除或修改此文件。
a:设置文件为只追加属性,即不允许文件内容被修改,只能在文件末尾添加内容。
d:设置目录为不可删除属性,即不允许删除此目录及其下的文件。
s:启用不可扩展属性,文件大小不能增长超过现有的预分配大小。 D:启用目录上的不可删除属性,目录下的文件不能被删除或重命名。
A:设置文件为noatime属性,可以减少磁盘I/O,因为不会更新文件的最后访问时间。 c:启用压缩属性,文件将被自动压缩以节省磁盘空间。
使用示例:
//1、设置文件为不可变
sudo chattr +i filename
//这将使filename文件变为不可变状态,无法被删除、修改或重命名。
//2、查看文件的属性
//这将显示filename文件的当前属性。如果文件被设置为不可变,输出中会包含i字符。
lsattr filename
//3、删除文件的不可变属性
sudo chattr -i filename
//4、设置文件只能追加内容
sudo chattr +a filename
//5、递归地修改目录属性
sudo chattr -R +i directoryname
(3)lsattr 显示档案隐藏属性
命令格式: lsattr [-adR] 档案或目录
选项与参数:
-a:将隐藏文件的属性也秀出来;
-d:如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
-R:连同子目录的数据也一并列出来;
使用示例:使用chattr 设定后,可以利用lsattr 来查阅隐藏的属性。
#! /bin/bash
z@zy:/tmp$ sudo chattr +aij text.txt
z@zy:/tmp$ lsattr text.txt
----ia----j---e--- text.txt
(4)档案特殊权限:SUID、SGID、SBIT
SUID:Set User ID
SGID:Set Group ID
SBIT:Sticky Bit
是Linux和Unix系统中文件权限的特殊属性,它们允许执行文件或访问目录时以特定的用户或群组身份进行操作。
4 为 SUID2 为 SGID1 为 SBIT
SUID权限
SUID(Set User ID) 权限允许用户执行某个文件时,该文件以文件所有者的权限运行,而不是以执行该文件的用户的权限运行。这通常用于需要特定权限才能执行的任务,比如修改系统密码(/usr/bin/passwd)。
SGID权限
SGID(Set Group ID) 权限有两种主要用途:一是影响执行文件的权限,二是影响目录中新创建文件的群组属性。
SBIT权限
在Unix和类Unix系统(包括Linux)中,Sticky Bit是一种特殊的文件权限标志,它可以在目录上设置,以改变目录中文件的删除和重命名行为。
当在目录上设置了Sticky Bit时,只有文件的拥有者、目录的拥有者或者具有超级用户权限的用户才能删除或重命名该目录中的文件。这对于共享目录特别有用,因为它可以防止用户删除或覆盖其他用户的文件。
使用示例:使用chmod命令可以设置SUID和SGID权限
//为文件设置SUID权限
chmod u+s filename
//为文件设置SGID权限(虽然对文件来说SGID的实际效果有限)
chmod g+s filename
//为目录设置SGID权限。
chmod g+s dirname
//设置SBIT权限
//设置Sticky Bit
chmod +t directory_name
//清除Sticky Bit
chmod -t directory_name
(5)file 观察文件类型
判断这个文件是属于ASCII,或者是data档案,或者是binary,且其中有没有使用到动态函式库等等信息。
8、指令与档案的搜寻:which、whereis、locate、find
(1)which 寻找【执行档】
用于查找并显示给定命令的绝对路径。
which 命令在环境变量 PATH 指定的路径中搜索某个系统命令的位置,并返回第一个搜索结果。也就是说,使用 which 命令可以查看某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
命令格式:which [参数] [可执行文件名称]
常用参数
-a:显示 PATH 变量中所有匹配的可执行文件,而不仅仅是第一个。
-n:设置文件名长度(不含路径),指定的长度必须大于或等于所有文件中最长的文件名。
-p:设置文件名长度(含路径),与 -n 参数类似,但此处包括了文件的路径。
-V:显示 which 命令的版本信息。
-w:指定输出时栏位的宽度。
--help:显示帮助信息。
--skip-dot:跳过 PATH 变量中以点号(.)开头的目录。
--skip-tilde:跳过 PATH 变量中以波浪号(~)开头的目录(通常表示家目录)。
--show-dot:在输出中不将点(.)扩展为当前目录。
--show-tilde:使用波浪线(~)代替路径中的家目录(仅对非 root 用户有效)。
注意:
which 命令只适用于查找可执行程序,而不适用于内置命令和命令别名。对于内置命令(如 cd、echo 等),which 命令将无法找到其路径。
使用示例:
//1、查找命令的绝对路径
which ls
//2、查找所有匹配的命令
which -a java
//3、设置文件名长度
//假设 bash 命令的绝对路径是 /bin/bash,则此命令将输出 /bin/bas(因为指定了长度为 10,但不含路径,所以只显示了前 10 个字符)。
which -n 10 bash
//4、显示版本信息
which -V
(2)whereis 快速定位二进制文件、源代码文件和手机页的位置
whereis 命令在系统预定义的路径中查找指定程序的二进制文件、源代码文件和手册页。这些路径通常是系统安装程序时使用的默认路径。通过使用 whereis,用户可以避免在文件系统中盲目搜索,从而提高效率。
命令格式:whereis [-bfmsu] [-B <目录>...] [-M <目录>...] [-S <目录>...] [文件...]
常用参数
-b:只搜索二进制文件。
-f:终止目录列表并表示文件名的开始(在使用 -B、-M 或 -S 指定搜索路径时,必须使用 -f 来明确指示文件名的开始)。
-m:只搜索手册页。
-s:只搜索源代码文件。
-u:搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件(此选项较少使用,因为 whereis 主要用于查找上述三类文件)。
-B <目录>:指定搜索二进制文件的路径。
-M <目录>:指定搜索手册页的路径。
-S <目录>:指定搜索源代码文件的路径。
使用示例:
//1、查找指定程序的所有相关信息
whereis ls
//2、只查找二进制文件
whereis -b ls
//3、指定搜索路径
whereis -s -S /usr/src -f ls
//4、查找多个程序
whereis grep awk
(3)locate 快速查找文件或目录的路径
locate 命令通过查询一个预先构建的索引数据库来快速定位文件或目录的位置。这个数据库包含了系统中所有文件和目录的名称及路径信息。由于 locate 命令不直接扫描文件系统,而是查询数据库,因此它的搜索速度非常快。
命令格式:locate [选项] [文件名/关键字]
常用参数
-i
:忽略大小写进行搜索。-n
:限制输出结果的数量。-r
:使用正则表达式进行搜索。-b
:仅匹配路径名的基本名称(即去除路径中的目录部分)。-c
:只返回匹配结果的数量,而不是文件路径。-d
:使用指定的数据库进行搜索,而不是默认数据库。-e
:仅打印当前现有文件的条目。-S
:打印有关每个数据库的统计信息,而不进行搜索。-q
:安静模式,不会显示任何错误消息。-l
或--limit
:将输出(或计数)限制为指定的条目数。-V
:显示locate
命令的版本信息。--help
:显示帮助信息。
//1、基本用法
locate filename
//2、忽略大小写
locate -i FILENAME
//3、限制输出结果数量
locate -n 10 filename
//4、使用正则表达式
//此命令将使用正则表达式 pattern.* 在数据库中查找文件,
//其中 pattern 是要匹配的文件名模式,.* 表示匹配任意数量的任意字符。
locate -r 'pattern.*'
//5、仅匹配路径名的基本名称
//此命令将仅匹配路径名的基本名称(即文件名),而不包括路径中的目录部分。
locate -b filename
//6、打印数据库统计信息
/此命令将打印有关当前使用的数据库的统计信息,如目录数量、文件数量和数据库大小等。
locate -S
注意:
在使用 locate 命令之前,需要确保文件数据库是最新的。因为locate 命令的搜索结果可能包含一些已经删除或移动的文件。
可以通过运行 updatedb 命令来更新数据库。updatedb 命令需要 root 权限才能运行,因为它会遍历整个文件系统并更新数据库。
(4)find 在指定的目录下搜索文件和目录
命令格式:find [path...] [expression]
path
:指定要搜索的起始目录路径。可以是一个或多个路径,如果不指定路径,则默认为当前目录。expression
:搜索条件和操作的组合,用于指定要匹配的文件或目录的条件以及要对匹配到的文件或目录执行的操作。常用选项:
1)按名称查找
-name [pattern]:根据文件名模式来匹配搜索文件。支持通配符,如 *、? 等。
-i name [pattern]:忽略文件名的大小写进行匹配。
2)按类型查找
-type type:根据文件类型进行搜索。
常见的类型有:
f:普通文件
d:目录
l:符号链接
c:字符设备文件
b:块设备文件
p:管道文件
3)按大小查找
-size [+-]size:根据文件大小进行搜索。可以使用 + 表示大于,- 表示小于,不加符号表示等于。单位可以是 c(字节)、k(千字节)、M(兆字节)、G(吉字节)等。
4)按时间查找
-mtime n:根据文件的修改时间进行搜索。n 表示 n 天前【一天之内】的文件。
-mtime +n:列出在 n 天之前(不含n 天本身)被更动过内容的档案档名;
-mtime -n:列出在 n 天之内(含n 天本身)被更动过内容的档案档名;
-atime n:根据文件的访问时间进行搜索。
-ctime n:根据文件的更改时间(如文件权限、属性等的更改)进行搜索。
-newer file:查找比指定文件新(或旧)的文件。
5)按权限查找
-perm mode:根据文件权限进行搜索。可以使用八进制数表示权限,如 644 表示所有者可读写,其他用户只读。
6)按属主/组查找
-user username:搜索指定所有者的文件。
-group groupname:搜索指定用户组的文件。
7)操作选项
-exec command {} \;:对搜索到的文件执行指定的命令。{} 表示匹配到的文件路径,\; 表示命令的结束。注意,\; 必须使用反斜杠 \ 进行转义,以避免被 shell 解释。
-ok command {} \;:与 -exec 类似,但在执行之前需要用户确认。
-delete:删除搜索到的文件或目录。
-print:将搜索到的文件路径输出到标准输出(默认操作)。
-ls:以 ls -l 命令的输出格式显示文件的详细信息。
-print0:以 NULL 字符作为分隔符输出搜索到的文件名,可以处理文件名中包含空格或其他特殊字符的情况。
逻辑操作符
-and:逻辑与操作,用于组合多个条件。默认情况下,多个条件之间就是使用 -and 进行组合的。
-or:逻辑或操作,用于组合多个条件。
-not 或 !:逻辑非操作,用于否定某个条件。
高级用法
结合其他命令:可以将 find 命令与其他命令(如 grep、sed、awk 等)结合使用,实现更复杂的操作。
使用 xargs 并行处理:可以使用 xargs 命令将 find 的结果传递给其他命令,并实现并行处理,以提高效率。
自定义输出格式:可以使用 -printf 格式化选项来自定义输出的格式。
使用示例:
//1、搜索当前目录下所有名字以 .jpg 结尾的文件:
find . -name "*.jpg"
//2、搜索根目录下所有属主为 root 并且文件大小大于 10M 的文件:
find / -user root -size +10M
//3、搜索当前目录及子目录下修改时间在 5 天以内的文件并删除:
find . -mtime -5 -exec rm {} \;
//4、搜索根目录下所有类型为目录的文件,并打印其路径:
find / -type d -print
//5、查找所有扩展名为 .log 的文件,并对每个文件执行 ls -l 命令:
find /path/to/search -name "*.log" -exec ls -l {} \;
//6、查找所有普通文件并将其权限设置为 644:
find /path/to/search -type f -exec chmod 644 {} \;
时间参数:区分atime, ctime 与 mtime 的意义:
(1)atime(Access Time):
意义:表示文件最后一次被访问的时间和日期。这里的“访问”通常指的是读取文件内容或执行文件。
更新时机:每当有应用程序或服务使用系统调用读取文件时,文件的访问时间都会更新。
(2)ctime(Change Time):
意义:表示文件状态最后一次改变的时间和日期。这里的“状态改变”包括更改文件权限、所有者、链接设置或文件内容(因为内容改变也会导致状态改变,但ctime与mtime的区别在于,ctime更侧重于文件属性的变化)。
更新时机:在写入文件、更改文件的所有者、权限或链接设置等操作时,文件的ctime会随之更新。
(3)mtime(Modify Time):
意义:表示文件内容最后一次被修改的时间和日期。
更新时机:当文件的内容发生改变时(如写入新数据或修改现有数据),文件的mtime会随之更新。
9、极重要!权限与指令间的关系
(1)让用户能进入某目录i成为【可工作目录】的基本权限为何:
- 可使用的指令:例如 cd 等变换工作目录的指令;
- 目录所需权限:用户对这个目录至少需要具有 x 的权限
- 额外需求:如果用户想要在这个目录内利用 ls 查阅文件名,则用户对此目录还需要 r 的权限。
(2)用户在某个目录内读取一个档案的基本权限为何?
- 可使用的指令:例如本章谈到的 cat, more, less 等等
- 目录所需权限:用户对这个目录至少需要具有 x 权限;
- 档案所需权限:使用者对档案至少需要具有 r 的权限才行!
(3)让使用者可以修改一个档案的基本权限为何?
- 可使用的指令:例如 nano 或未来要介绍的 vi 编辑器等;
- 目录所需权限:用户在该档案所在的目录至少要有 x 权限;
- 档案所需权限:使用者对该档案至少要有 r, w 权限
(4)让一个使用者可以建立一个档案的基本权限为何?
目录所需权限:用户在该目录要具有 w, x 的权限,重点在 w 啦!
(5)让用户迚入某目录幵执行该目录下的某个指令之基本权限为何?
- 目录所需权限:用户在该目录至少要有 x 的权限;
- 档案所需权限:使用者在该档案至少需要有 x 的权限