linux文件与目录管理
1. 目录与路径
1.1目录的相关操作
. #当前目录
.. #上一层目录
- #前一个工作目录
~ #使用者的家目录
~a #a的家目录
命令
cd
切换目录
pwd
显示当前目录
pwd [-P]
参数
-P #显示真正的路径,而不是使用链接(link)路径
# 如果/var/mail是链接文件 链接到/var/spool/mail
$ cd /var/mail
$ pwd #显示/var/mail
$ cd /var/mail
$ pwd -P #显示/var/spool/mail
mkdir
创建空目录
mkdir [-pm] 目录名称
#参数
-m:后接权限 如744,直接设置了文件权限
-p:递归创建,
#使用mkdir test/test1/test 会出错
$ mkdir -p test/test1/test
$ mkdir -m 744 test
rmdir
删除空目录
rmdir [-p] 目录名称
# 参数
-p:连同上层的“空的”目录一起删除
#rmdir test/test1/test2出错,因为test不为空
$ rmdir -p test/test1/test2
1.2.系统环境变量:$PATH
PATH(大写)是由一堆目录组成,每个目录中间用冒号(:)来隔开,每个目录有顺序之分
PATH的重要性
例子:
# ls命令存在/bin/ls 移动到/root目录下
# 任何目录下无法直接调用ls命令,因为/root不在PATH中,
#想要调用,需要指明路径
$ /root/ls
#如果在/root路径下
$ ./ls
#可以将/root路径添加到PATH中
#上面讲到,PATH中的内容是由冒号隔开
$ PATH="${PATH}:/root"
#如果环境变量中多个目录存在ls,则优先调用先查询到的,即靠前的
$ echo $PATH
/home/chenai/bin:/home/chenai/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin
不将当前目录(.)加入环境变量中的原因:
- 当前目录并非固定
- /tmp任何人都可操作,如果有用户在此中写入命令,会导致用户数据泄露,不安全
不同身份用户默认的PATH不同,默认能够随意执行的命令也不同
使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查找PATH来的正确
因为PATH中的命令需要一个个目录查询
2. 文件与目录管理
2.1 ls命令
ls [options] 1 2 3(可以显示多个)
-a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出);
-A:显示除影藏文件“.”和“..”以外的所有文件列表;
-C:多列显示输出结果。这是默认选项;
-l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列;
-F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符;
-b:将文件中的不可输出的字符以反斜线“”加字符编码的方式输出;
-c:与“-lt”选项连用时,按照文件状态时间排序输出目录内容,排序的依据是文件的索引节点中的ctime字段。与“-l”选项连用时,则排序的一句是文件的状态改变时间;
-d:仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表;
-f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果;
-i:显示文件索引节点号(inode)。一个索引节点代表一个文件;
--file-type:与“-F”选项的功能相同,但是不显示“*”;
-k:以KB(千字节)为单位显示文件大小;
-l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等;
-m:用“,”号区隔每个文件和目录的名称;
-n:以用户识别码和群组识别码替代其名称;
-r:以文件名反序排列并输出目录内容列表;
-s:显示文件和目录的大小,以区块为单位;
-t:用文件和目录的更改时间排序;
-L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录;
-R:递归处理,将指定目录下的所有文件及子目录一并处理;
--full-time:列出完整的日期与时间;
--color[=WHEN]:使用不同的颜色高亮显示不同类型的。
# 查看家目录下所有文件(含属性和隐藏文件)
$ ls -al ~
# 完整的显示文件的修改时间
$ ls -al --full-time ~
2.2 cp、rm、mv
1.cp
cp [-adfilprsu] 源文件 目标文件
cp [options] source1 source2 ..... 目标文件
-a:此参数的效果和同时指定"-dpR"参数相同;
-d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
-f:强行复制文件或目录,不论目标文件或目录是否已存在;
-i:覆盖既有文件之前先询问用户;
-l:对源文件建立硬连接,而非复制文件;
-p:保留源文件或目录的属性;
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
-s:对源文件建立符号连接,而非复制文件;
-u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
-S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀;
-b:覆盖已存在的文件目标前将目标文件备份;
-v:详细显示命令执行的操作。
复制家目录下的.bashrc文件到/tmp/bashrc
$ cp ~/.bashrc /tmp/bashrc
# 如果存在则覆盖,会询问
$ cp -i ~/.bashrc /tmp/bashrc
# 复制所有属性,如文件的时间、文件归属组和用户等
$ cp -a ~/.bashrc /tmp/bashrc
# 递归复制,文件与目录的权限可能会被改,可以使用 -a参数
$ cp -r /etc /tmp
# 文件有差异性才会复制,且~/.bashrc文件比/tmp/bashrc新,常被用做备份命令
$ cp -u ~/.bashrc /tmp/bashrc
#复制链接文件的链接属性,不加d会复制源文件的内容
$ cp -d ~/.bashrc /tmp/bashrc
2.rm
rm [-fir] 文件或目录
-f, --force 忽略不存在的文件,从不给出提示。
-i, --interactive 进行交互式删除,删除前询问
-r, --recursive 指示rm将参数中列出的全部目录和子目录均递归地删除。
2.3.获取路径的文件名与目录名称
# 取得最后的文件名
$ bashname /etc/sysconfig/network
network
#取得的变成目录名
$ dirname /etc/sysconfig/network
/etc/sysconfig
3. 文件内容查看
3.1 直接查看文件内容
1 cat
从第一行开始显示文件内容
cat [options]
-A, --show-all 等价于 -vET
-b, --number-nonblank 对非空输出行编号
-e 等价于 -vE
-E, --show-ends 在每行结束处显示 $
-n, --number 对输出的所有行编号
-s, --squeeze-blank 不输出多行空行
-t 与 -vT 等价
-T, --show-tabs 将跳 字符显示为 ^I
-u (被忽略)
-v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外
--help 显示此帮助信息并离开
2.tac
从最后一行开始显示,是cat倒着写
$ tac 目标文件
3.nc
带行号显示
3.2 翻页查看
1 more
$ more 目标
more命令中可输入指令:
- 空格:向下翻一页
- Enter:向下一行
- /字符串:向下查找,也可以输入指令
- q :表示退出
- :f : 显示文件名以及目前的行数
- b :往回翻页,对管道无效
上述四个个字符指令需要按下回车才能生效
2 less
功能比more强大,可以往前翻
3.3 数据截取
1 head
# 查看前number行数据
$ head [-n number] 文件
2 tail
# 显示后number行数据
$ tail [-n number] 文件
# 持续显示后续内容,直至输入[ctrl]-c结束
$ tail -f 文件
应用:截取11-20行数据
$ head -n /etc/man_db.conf | tail -n 10
应用:截取11-20行数据并显示行号
$ cat -n /etc/man_db.conf | head -n 20 |tail -n 10
管道( | ):前面的命令所输出的信息,通过管道交由后续的命令继续使用
3.非纯文本文件:od
$ od [-t type] 文件
-t:选择输出格式。
格式为:-t [acdfoux][size].
a:每个ASCII码对应的名字。
b:用八进制字节表示的字符对应的ASCII码值
d:有符号数值,SIZE个字节
f:浮点数,SIZE个字节
o:八进制数,SIZE个字节
u:无符号数值,SIZE个字节
x:十六进制数,size个字节
4 修改文件时间或创建文件:touch
修改文件的建立(mtime)或读取(atime)或更新(ctime)时间
$ touch [options] 文件
# 参数
-a 或--time=atime或--time=access或--time=use 只更改存取时间。
-c 或--no-create 不建立任何文档。
-d 使用指定的日期时间,而非现在的时间。
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m 或--time=mtime或--time=modify 只更改变动时间。
-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
-t 使用指定的日期时间,而非现在的时间。
ll 表示 ls -l 别名
touch被常使用情况:
- 创建一个空文件
- 将某个文件日期自定义为目前(mtime与atime)
4. 文件与目录的默认权限与隐藏权限
4.1.文件默认权限
# 数字类型的权限设置值 默认值需要减掉的权限,如0022 第一个0为特殊权限,第二则是所属用户权限默认值需要减掉的值
# 如文件默认值为666 umask为0022 则文件被建立时 权限变为644
$ umask
# 符号类型的权限设置值
$ umask -S
4.2 文件的特殊权限:SUID、SGID、SBIT
特殊权限的选择
- 4为SUID
- 2为SGID
- 1为SBIT
修改特殊权限
# 使filename具备SUID权限
$ chmod 4755 filename
-rwsr-xr-x
# 使filename具备SGID权限
$ chmod 2755 filename
-rwxr-sr-x
# 使filename具备SBIT权限
$ chmod 1755 filename
-rwsr-xr-t
# 使filename具备SUID、SGID权限
$ chmod 6755 filename
-rwsr-sr-x
1 SUID
满足条件时,通过SUID权限可以短暂获取文件拥有者权限
功能和限制:
- SUID权限仅对二进制程序有效
- 执行者对于该程序需要具有x的可执行权限
- 本权限尽在执行该程序的过程中有效
- 执行者将具有该程序拥有者的权限
- 仅可用在二进制程序上,不可用在shell脚本上
作用:例如/usr/bin/passwd中,具备SUID权限,如果用户A只是没有r权限,此文件拥有者为root,那么通过SUID权限可以暂时获取拥有者root权限去读取。
权限显示位置:在拥有者这一项权限中,将x权限替代为s权限
-rwsr-xr-x
2 SGID
满足条件时,通过SGID可以短暂获取用户组的权限
SGID可以针对文件或目录来设置,如果目标是文件:
- SGID对二进制有用
- 程序执行在对于该程序来说,需有x的权限
- 执行者在执行的过程中将会获得该程序用户组的支持
如果目标是目录:
- 用户若对于此目录具备r于x的权限时,该用户能够进入此目录
- 用户在此目录下的有效用户组(effictive group)将会变成该目录的用户组
用途:若此用户在此目录下具备w的权限(可以创建文件),则用户所建立的新文件,该新建的用户组与此目录(拥有SGID权限)的用户组相同。
-rwxr-sr-x
SBIT
只对目录有效
作用:
- 当用户对于此目录具备w、x权限,即具有写入的权限
- 当用户在该目录下创建文件或目录时,仅有自己与root才有权力删除该文件
-rwsr-xr-t
4.3 观察文件类型
查看文件基本信息
$ file 文件
5. 命令与文件的查找
5.1 脚本文件的查找
which :根据PATH这个环境变量所规范的路径,去查找执行文件的文件名
$ which [-a] command
-a: 将所有由PATH目录中可以找到的命令名均列出,而不止第一个
$ which -a ifconfig
5.2 文件的查找
find :除速度慢外,也影响硬盘性能,最后考虑它。尽量不要用
whereis : 只找系统中某些特定目录下面的文件。
locate:利用数据库(文件的映射)来查找文件名, 数据库的建立默认是在每天执行一次,建立新的文件后,需要更新数据库。
updatedb:更新数据库,如果locate查不到,可以选择更新一下数据库。
$ whereis [options] 文件或目录
# 参数
-l 可以列出whereis会去查询的几个主要目录
-b 定位可执行文件。
-m 定位帮助文件,即在man里的文件名。
-s 定位源代码文件。
-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。
$ locate [options] keyword
-i, --ignore-case 忽略大小写
-l, --limit, -n 输出几行 , 如-l 5 五行
-c, --count 不输出文件名,只输出找到的数量
-S, --statistics 输出locate所使用的数据库文件的相关信息
-r, --regexp REGEXP 使用基本正则表达式
# 有点多,自行查找
$ find [PATH] [option] [action]
# 参数
3.与文件权限及名称相关的参数:
-name, filename :查找文件名称为filename的文件
-size [+-]SIZE:查找比SIZE大(+)或小(-)的文件