(四)Linux文件和目录

深入理解2

路径

  • 相对路径

顾名思义,相对与本层路径的路径,使用../回到上一层目录

  • 绝对路径

路径从根目录写起

操作目录

1
2
3
4
5
.			代表此层目录
.. 上一层目录
- 前一个工作目录
~ 使用者身份的家目录
~account account的家目录

每个目录下都有...这两个目录

根目录的..就是它自己

处理目录的指令

  • cd(change directory)

  • pwd(Print working directory)

    • 使用pwd -p可显示链接文件的完整目录
  • mkdir(make directory)

    • -m创建目录时设定权限,默认权限与umask有关

      mkdir -m 711 test

    • -p递归创建目录

      mkdir -p 1/2/3/4

  • rmdir(remove directory)

    • 仅删除空目录(empty directory)
    • -r不管有没有文件和目录都删除,有点危险
    • -p递归删除,也要空目录才行

路径变量$PATH

使用的指令是可执行文件,例如ls/bin/ls,为什么在任何地方都可以执行这个指令呢?这就是环境变量PATH的原因

查看一下PATH

1
2
[root@study /]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  • 由一堆目录组成,每个目录用:隔开

  • 添加目录:PATH="${PATH}:目录"

  • 不同身份的PATH不同,指令也不同,例如root和普通用户

  • .目录建议别加入PATH,防止被有心人执行恶意指令

文件和目录管理

ls

  • 显示目录和文件,默认显示操作目录
  • 常用l(显示权限)、a(显示隐藏文件)、d
  • ll表示ls -l
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-C     多列输出,纵向排序。

-F 每个目录名加“ / ”后缀,每个 FIFO 名加“ | ”后缀,
每个可运行名加“ * ”后缀。

-R 递归列出遇到的子目录。

-a 列出所有文件,包括以 "." 开头的隐含文件。

-c 使用“状态改变时间”代替“文件修改时间”为依据来排序
(使用“ -t ”选项时)或列出(使用“ -l ”选项时)。

-d 将目录名象其它文件一样列出,而不是列出它们的内容。

-i 输出文件前先输出文件系列号(即 i 节点号: i-node num‐
ber)。 -l 列出(以单列格式)文件模式( file mode
),文件的链
接数,所有者名,组名,文件大小(以字节为单位),时间信
息,及文件名。缺省时,时间信息显示最近修改时间;可以以
选项“ -c ”和“ -u ”选择显示其它两种时间信息。对于设
备文件,原先显示文件大小的区域通常显示的是主要和次要的
号(majorand minor device numbers)。

-q 将文件名中的非打印字符输出为问号。(对于到终端的输出这是缺省的。)

-r 逆序排列。

-t 按时间信息排序。

-u 使用最近访问时间代替最近修改时间为依据来排序(使用 “ -t
”选项时)或列出(使用“ -l ”选项时)。

-1 单列输出。

cp

  • cp [选项] 源文件 目标文件/目录
  • cp [选项] 目录 目标路径
  • 复制时注意文件属性,比如备份注意-a-p,复制给其他用户时要注意文件权限
    • 用户若没有权限更改某些属性,使用-a也没用
  • 使用-l创建硬链接(hard link),-s创建符号链接(symbolic link),符号连接有->符号
  • 当文件更新才复制使用-u
  • 如果源文件两个以上,则最后一个一定要是目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
   -a, --archive
复制时,尽可能保持文件的结构和属性.(但不保持目录 结构)等同于 -dpR。

-d, --no-dereference
复制符号链接作为符号链接而不是复制它指向的文件, 并且保护在副本中原文件之间的硬链接.

-f, --force
删除存在的目标文件。 (较:原译文缺下面的部分)

-i, --interactive
无论是否覆盖现存文件都作提示。

-l, --link
制作硬链接代替非目录拷贝。

-p, --preserve
保持原始文件的所有者,组,许可,和时间表属性。

-P, --parents
一个斜杠和指定的源文件名构成目的文件。 最后送给 cp 的参数必须是一个已存在的目录的名字。例如, 下面这个命令:
cp --parents a/b/c existing_dir
复制文件 `a/b/c' 到 texisting_dir(现有的目录)/a/b/c',建立任 何缺少的中间目录。

-r 递归地复制目录,复制任何非目录和非符号链接(那是,FIFOs和特别文件)好象他们是常规的文件一样看待.这 意味着尝试读出每个源文件的数据,和把它写到目的地
上.因而,用这个选项,cp'可能彻底地终止,当不确定地读一个FIFO或者/dev/tty时,(这是一个缺陷.它意味着如果你不知道在这棵树(目录)中有什么要复制的时候,
你不得不避开-r并使用-R打开一个未知的设备文件, 比如说一台扫描仪,会有未知的效果发生在硬件上)

-R, --recursive
递归地复制目录,保留非目录(参见上面的 -r ).
--sparse=WHEN
一个稀疏file'包容`holes'-占用0字节,它不占用任何物理块;系统把他们作为0调用read'来读.由于许多二进制文件包容许多连续的0字节,这样能保存相当的磁盘空
间并且加快速度.省缺情况下, cp 通过自然的启发方式发现在源文件里holes并且使相关的输出文件稀疏.

WHEN 值能够是下面中的一个:

auto 默认的行为:如果输入文件是稀疏的,输出文件也是稀疏的.

always 总是使输出文件稀疏.当输入文件所在的文件系统不支 持稀疏文件的时候,这是有用的,但是输出文件所在的 文件系统需要(支持稀疏文件).

never 从不使输出文件稀疏.如果你找到一个需要此选项的应 用程序,让我们知道.

-s, --symbolic-link
生成符号链接代替非目录拷贝.所有的源文件名必须是 绝对的(由`/'开始),除非目的文件是在当前目录.这选 项仅仅在系统不支持符号链接时引起一个错误消息.

-u, --update
如果存在的目的地有相同的,或者更新的修改时间,不复制非目录(文件).

-v, --verbose
在复制前印出文件名.

-x, --one-file-system
跳过来自不同文件系统的子目录.

rm

  • -f(force),忽略不存在的文件,不警告
  • -i,删除有提示,防止删错
  • -r,递归删除,删除这个目录下的所有东西,不提示

我逛酷安时看到一老哥手机变砖求助,一小伙子正经的说在终端输入rm -rf /,最牛逼的是这老哥还真试了,然后emmm(笑哭)

  • 要注意若文件名与指令重合,使用./

mv

  • 用于移动文件或者重命名
  • -f,存在不会提示
  • -i,存在提示是否覆盖
  • -u,文件较新才会更新
  • 可以移动多个文件mv t1 t2 t3 目录

改名字

1
mv test1 test2
  • 使用rename可以批量修改文件名

获取文件名和目录名

  • basename
  • dirname

显示文件内容

cat(concatenate)

  • 将文件的内容连续打印在屏幕上
  • -A可以显示一些特殊字符,比如TAB^I,换行是$
  • -n可以打印行号

tac

  • 是cat的反序,意思就是从最后一行打印到第一行

nl

  • 添加行号打印
  • -b a不管是否有空行,都打印行号,-b t不打印空行(默认值)
  • -n ln行号在最左边显示,-n rn在右边显示行号,不补齐0,-n nz补齐0(默认6位)
  • -w可以设置补齐位数
1
2
3
4
[root@study ~]# nl -b a -n rz -w 4 /etc/issue
0001 \S
0002 Kernel \r on an \m
0003

more

1
2
3
[root@study ~]# more /etc/man_db.conf 
内容略
--More--(36%)
  • 可以一页一页的翻动,而不是像cat那样全部显示出来
    • space:向下翻页
    • enter:向下翻一行
    • /string:搜索字符串,n向下搜索
    • :f:显示文件名和当前行数
    • q:离开more
    • bctrl+b:往回翻页,对文件有效,对管道无效

less

  • 比more功能更多
  • space、PD:向下翻页
  • PU:向上翻页
  • /string
  • ?string
  • n
  • N
  • g:回到开头
  • G:结尾
  • q:离开

数据截取

  • 显示前几行,默认10行
  • -n num可以显示num行
    • num是负数表示的意思是后面num行不显示

tail

  • 显示后面几行
  • -n num
    • -n +num表示文件会从num行后加载出来
  • -f表示刷新显示这个文件,ctrl+c停止

如何显示中间的5-6行?

1
head -n 6 file | tail -n 2

|是一个管道指令,表示前面的信息交由后面的指令执行

如何显示5-6行的行号?

1
cat -n file | head -n 6 | tail -n 2

非纯文本文件

od

  • od [-t TYPE]
  • TYPE
    • a:named character, ignoring high-order bit,默认字符输出
    • c:ASCII输出
    • d[size]:利用十进制(decimal)输出数据,每个数据占size字节
    • f[size]:利用浮点数值(floating)输出数据,每个数据占size字节
    • o[size]:利用八进制(octal)输出数据,每个数据占size字节
    • x[size]:利用十六进制(hexadecimal)输出数据,每个数据占size字节

size可以用整数或者大写字母C(sizeof(char)),S(sizeof(shot)),I(sizeof(int)),L(sizeof(long))

官方文献

If TYPE is f, SIZE may also be F for sizeof(float),

D for sizeof(double) or L for sizeof(long double).

实践在数据若没有到高四位时,使用0011填充,

按1字节从低位向高位填充

1
2
3
4
5
6
7
8
9
例如
[root@study ~]# echo 0123 |od -t dCc
0000000 48 49 50 51 10
0 1 2 3 \n
0000005
[root@study ~]# echo 0123 | od -t dSc
0000000 12592 13106 10
0 1 2 3 \n
0000005

修改文件时间或创建新文件

三个时间参数

  • modification time,mtime
    • 修改时间
    • 当文件的内容改动时就会更新这个时间
  • status time,ctime
    • 状态时间
    • 文件的状态,也就是文件的属性、权限
  • access time,atime
    • 读取时间
    • 文件被读取,这个时间就会被更新
1
2
3
4
5
[root@study ~]# date;ll /etc/man_db.conf ;ll --time=atime /etc/man_db.conf ;ll --time=ctime /etc/man_db.conf 
2020年 01月 02日 星期四 17:45:20 CST
-rw-r--r--. 1 root root 5171 10月 31 2018 /etc/man_db.conf
-rw-r--r--. 1 root root 5171 1月 2 03:44 /etc/man_db.conf
-rw-r--r--. 1 root root 5171 12月 28 07:32 /etc/man_db.conf

touch

  • touch [-acdmt] 文件
  • -a:自定义access time
  • -c:若没有这个文件则不建立新文件
  • -d:后面接自定义的时间,同–date=”日期或时间”
  • -m:修改modification time
  • -t:使用自定义时间,格式[YYYYMMDDhhmm]

一般用法:

  • 创建空文件
  • 修改问文件时间atime和mtime

默认权限umask

umask用来指定用户在创建文件的权限的默认值

两种方式查看umask

1
2
3
4
[root@study ~]# umask
0022
[root@study ~]# umask -S
u=rwx,g=rx,o=rx
  • 文件属性默认666
1
-rw-rw-rw-
  • 目录属性777
1
drwxrwxrwx

umask代表拿掉权限,只看后面3个数字

1
2
3
4
5
6
建立文件:(-rw-rw-rw-)-(-----w--w-)==>-rw--r--r--
建立目录:(drwxrwxrwx)-(d----w--w-)==>drwxr-xr-x
注意:777-022=755,666-022=644虽然是没错
但是有特殊情况比如:
(-rw-rw-rw-)-(--------wx)==>-rw---r--r--
666-003=663,原本没有x,怎么变成了-wx

设置umask

  • umask 002

文件隐藏属性

隐藏属性对于系统安全(Security)是很有帮助的

chattr配置隐藏属性

  • chattr [+-=][ASacdistu] file/dir

  • 只能在ext2、ext3、ext4的Linux传统文件系统上完整生效

  • xfs只支持AadiS参数

  • +添加属性

  • -

  • =直接配置属性

  • Aatime不能被修改

  • S一般是非同步写入磁盘,加上后,任何修改都会同步写入磁盘

  • a只能添加数据,不能删除和修改,root才能设置

  • c将文件压缩,读取会自动解压缩

  • d当dump程序执行时,可以不被dump备份

  • i可以让一个文件不能被删、改名、添加数据,root

  • s使文件可以被完全删除,无法恢复

  • u删除可以恢复

lsattr显示文件隐藏属性

  • lsattr [-adR]
  • -a将隐藏文件的属性也显示出来
  • -d如果是目录,仅列出目录本身属性而非目录的文件名
  • -R连同子目录的数据也一并列出来

文件的特殊权限

Set UID

1
2
[root@study tmp]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27856 8月 9 09:39 /usr/bin/passwd
  • SUID仅对二进制程序(binary program)有效
  • 执行者需要对该程序有x权限
  • 本权限在执行过程中有效
  • 执行者将具有该程序的拥有者权限(owner)

需要注意的是SUID不能用在shell脚本和目录上

Set GID

1
2
[root@study tmp]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate

与SUID不同,SGID针对文件和目录

对于文件

  • SGID对二进制程序有用
  • 执行需要x权限
  • 执行者在执行过程中会获得程序用户组的支持

对于目录

  • 用户对该目录有r、x权限才能进入该目录
  • 用户在目录下的有效用户组将会变成该目录的用户组
  • 用途:若用户有w权限,则用户创建的新文件的用户组与该目录的用户组相同

Sticky Bit

1
2
[root@study tmp]# ll -d /tmp/
drwxrwxrwt. 58 root root 8192 1月 2 19:41 /tmp/=

SBIT只对目录有效

  • 当用户具有wx权限
  • 当用户建立文件或目录时,仅root和用户才有权利删除

权限的设置

数字

  • SUID=4
  • SGID=2
  • SBIT=1

chmod 4755 file即表示-rwsrw-rw-

符号

  • SUID=u+s
  • SGID=g+s
  • SBIT=o+t

-rwSrwSrwT表示没有x权限,小写才有x权限

观察文件类型

使用file 文件名可以简单的判断文件的格式

查找命令和文件

查找脚本文件

  • which [-a] command
  • 会根据PATH变量区查,重点在于找出可执行文件

文件的查找

where

  • whereis [-bmsu] filename/dir
  • 这个指令只会在特定的目录查找
  • 使用where -l可以查看它查找的目录

locate/updatedb

  • locate [-iclSr] keyword
  • 会查找有关键字的文件
  • locate查找的数据是已建立的数据库/var/lib/mlocate
  • 而这个数据库每天自动更新一次
  • 使用updatedb可以根据/etc/updatedb.conf配置文件去更新数据库

find

  • 功能强调,比较费磁盘资源,不得已不用
  • 可以寻找某段时间参数的文件
  • 查找某个人、某个群组的文件,还可以查找一些孤魂文件
  • 支持通配符(如`-name “*keyword**”`,测试单双引号或无引号都行)
  • 查找某类型的文件(普通f,设备bc,目录d。。)
  • 文件大小范围查找,权限范围查找(包括特殊权限)
  • 此外find特殊的就是支持额外的action
1
[root@study /]# find / -perm /7000 -exec ls -l {} \;
  • 至于怎么操作,man吧

参考《鸟哥的Linux私房菜 基础学习篇》

作者

manu

发布于

2020-01-07

更新于

2023-01-06

许可协议


:D 一言句子获取中...