文件,目录管理

系统目录结构及文件类型

一, 系统目录结构

  • 1、/- 根 
    每一个文件和目录从根目录开始。 
    只有 root 用户具有该目录下的写权限。请注意,/root 是 root 用户的主目录,这与 /. 不一样

  • 2、/bin 中 - 用户二进制文件 
    包含二进制可执行文件。 
    在单用户模式下,你需要使用的常见 Linux 命令都位于此目录下。系统的所有用户使用的命令都设在这里。 
    例如:ps、ls、ping、grep、cp

  • 3、/sbin 目录 - 系统二进制文件 
    就像 /bin,/sbin 同样也包含二进制可执行文件。 
    但是,在这个目录下的 linux 命令通常由系统管理员使用,对系统进行维护。例如:iptables、reboot、fdisk、ifconfig、swapon 命令

  • 4、/etc - 配置文件 
    包含所有程序所需的配置文件。 
    也包含了用于启动 / 停止单个程序的启动和关闭 shell 脚本。例如:/etc/resolv.conf、/etc/logrotate.conf

  • 5、/dev - 设备文件 
    包含设备文件。 
    这些包括终端设备、USB 或连接到系统的任何设备。例如:/dev/tty1、/dev/usbmon0

  • 6、/proc - 进程信息 
    包含系统进程的相关信息。 
    这是一个虚拟的文件系统,包含有关正在运行的进程的信息。例如:/proc/{pid} 目录中包含的与特定 pid 相关的信息。 
    这是一个虚拟的文件系统,系统资源以文本信息形式存在。例如:/proc/uptime

  • 7、/var - 变量文件 
    var 代表变量文件。 
    这个目录下可以找到内容可能增长的文件。 
    这包括 - 系统日志文件(/var/log); 包和数据库文件(/var/lib); 电子邮件(/var/mail); 打印队列(/var/spool); 锁文件(/var/lock); 多次重新启动需要的临时文件(/var/tmp);

  • 8、/tmp - 临时文件 
    包含系统和用户创建的临时文件。 
    当系统重新启动时,这个目录下的文件都将被删除。

  • 9、/usr - 用户程序 
    包含二进制文件、库文件、文档和二级程序的源代码。 
    /usr/bin 中包含用户程序的二进制文件。如果你在 /bin 中找不到用户二进制文件,到 /usr/bin 目录看看。例如:at、awk、cc、less、scp。 
    /usr/sbin 中包含系统管理员的二进制文件。如果你在 /sbin 中找不到系统二进制文件,到 /usr/sbin 目录看看。例如:atd、cron、sshd、useradd、userdel。 
    /usr/lib 中包含了 /usr/bin 和 /usr/sbin 用到的库。 
    /usr/local 中包含了从源安装的用户程序。例如,当你从源安装 Apache,它会在 /usr/local/apache2 中。

  • 10、/home - HOME 目录 
    所有用户用 home 目录来存储他们的个人档案。 
    例如:/home/john、/home/nikita

  • 11、/boot - 引导加载程序文件 
    包含引导加载程序相关的文件。 
    内核的 initrd、vmlinux、grub 文件位于 /boot 下。 
    例如:initrd.img-2.6.32-24-generic、vmlinuz-2.6.32-24-generic

  • 12、/lib - 系统库 
    包含支持位于 /bin 和 /sbin 下的二进制文件的库文件. 
    库文件名为 ld或 lib.so.* 
    例如:ld-2.11.1.so,libncurses.so.5.7

  • 13、/opt - 可选的附加应用程序 
    opt 代表可选的。 
    包含从个别厂商的附加应用程序。 
    附加应用程序应该安装在 /opt/ 或者 /opt/ 的子目录下。

  • 14、/mnt - 挂载目录 
    临时安装目录,系统管理员可以挂载文件系统。

  • 15、/media - 可移动媒体设备 
    用于挂载可移动设备的临时目录。 
    举例来说,挂载 CD-ROM 的 /media/cdrom,挂载软盘驱动器的 /media/floppy;

  • 16、/srv - 服务数据 
    srv 代表服务。 
    包含服务器特定服务相关的数据。 
    例如,/srv/cvs 包含 cvs 相关的数据。

二, 文件类型

我们使用 ls -l 这个命令时,可以观察到第一栏那十个字符中,第一个字符为文件的类型 [d 表示目录,- 表示是一个普通的文件,c 表示字符串设备,l 表示软链接文件,b 块设备]。

  • 普通文件 (regular file): 一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为 [-],例如 [-rwxrwxrwx]。另外,依照文件的内容,又大略可以分为:

    • 纯文本档 (ASCII):这是 Linux 系统中最多的一种文件类型, 称为纯文本档是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设定的文件都属于这一种文件类型。 举例来说,你可以下达『 cat ~/.bashrc 』就可以看到该文件的内容。 (cat 是将一个文件内容读出来的指令)

    • 二进制文件 (binary):,我们的系统其实仅认识且可以执行二进制文件(binary file) 在 Linux 当中的可执行文件(scripts, 文字型批处理文件不算) 就是这种格式的 举例来说,我们经常使用的 cat 命令就是一个 binary file。

    • 数据格式文件 (data): 有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。举例来说,我们的 Linux 在使用者登入时,都会将登录的数据记录在 /var/log/wtmp 那个文件内,该文件是一个 data file,他能够透过 last 这个指令读出来! 但是使用 cat 时,会读出乱码 因为它是属于一种特殊格式的文件。

  • 目录 (directory): 就是目录 第一个属性为 [d],例如 [drwxrwxrwx]。 
    连接文件 (link): 就是类似 Windows 系统底下的快捷方式! 第一个属性为 ,例如 [lrwxrwxrwx] ;

  • 设备与装置文件 (device): 与系统周边及储存等相关的一些文件, 通常都集中在 /dev 这个目录之下!通常又分为两种:

    • 区块 (block) 设备档 :就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就是! 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备!你可以自行查一下 /dev/sda 看看, 会发现第一个属性为[b]!

    • 字符 (character) 设备文件:亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是『一次性读取』的,不能够截断输出。 举例来说,你不可能让鼠标『跳到』另一个画面,而是『滑动』到另一个地方啊!第一个属性为 [c]。

  • 数据接口文件 (sockets): 既然被称为数据接口文件, 想当然,这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个 socket 来进行数据的沟通了。第一个属性为 [s], 最常在 /var/run 这个目录中看到这种文件类型了。

  • 数据输送文件 (FIFO, pipe): FIFO 也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。 FIFO 是 first-in-first-out 的缩写。第一个属性为 [p] 。

注: 除了设备文件是我们系统中很重要的文件,最好不要随意修改之外,通常只有 root 用户才可以修改!


ls 命令,alias 命令及 which 命令

一,ls 命令

  • ls (list) 查看文档或目录的详细信息,常用选项如下, ls 命令的输出信息可以进行彩色加亮显 示,以分区不同类型的文件。

# ls -l //显示详细信息;

# ls -i //显示文件索引节点号(inode)。一个索引节点代表一个文件;

# ls -a //显示所有档案及目录包括隐藏的文件;

# ls -t //按文件的时间排序;

# ls -h //在-l的时候(可以显示文件大小的时候),可以自动的变化单位

# ls -d //只列目录本身

# ls -ld //查看指定目录的属性

# ls -tr //按时间倒叙排序,最近文件在最下面


ls 带 -l 参数时, 如果 ls 显示目录的内容,在最前面会显示该目录下所有文件所占的文件块的总数。
英文 total 中文有时译为“总用量”,也有译为“总计”。单位默认是 KB,也可以用 -k 参数指定单位。

文件,目录管理

  • 注:

# ls -lhtr filename/directory //该命令会列出目录下的所有文件,并且按照合适的大小显示(-h的作用),而且会按照时间的倒叙排序,一旦文件比较多,在有可能刷屏的情况下,较新的文件会出现在底部,方便查阅。

二,alias 命令

  • alias 中文意思为 “别名”
  • 功能说明:设置指令的别名。
  • 语  法:alias[别名]=[指令名称]
  • 参  数 : 若不加任何参数,则列出目前所有的别名设置。
    文件,目录管理


三,which 命令

  • which 命令的作用是,在 PATH 变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
    1. 命令格式: 
      which 可执行文件名称

    2. 命令功能: 
      which 指令会在 PATH 变量指定的路径中(使用命令:# echo $PATH 可以查看),搜索某个系统命令的位置,并且返回第一个搜索结果。

    3. 命令参数: 
      -n 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。 
      -p 与 -n 参数相同,但此处的包括了文件的路径。 
      -w 指定输出时栏位的宽度。 
      -V 显示版本信息 。



环境变量 PATH,cp 命令,mv 命令

一, 环境变量 PATH

  • 在介绍环境变量之前,先介绍一个命令 which,它用于查找某个命令的绝对命令。
    文件,目录管理
#echo $PATH   //这里的echo用来输出$PATH的值。PATH前面的$是变量的前缀符号。
  • 文件,目录管理文件,目录管理

  • 当我们输入一个命令时 (相对路径), 它会在以上这些目录里寻找这个命令。

命令实战

  • 在命令行可以使用 ls2 来代表 ls

  • 首先需要把 ls 的绝对路径 cp 到 /tmp/ls2,然后把 /tmp 这个路径加入到 PATH 下。ls2 就相当于 ls 可以用了。
    文件,目录管理
    注意: 当你在打开一个终端的时候,ls2 又不能用了,这是因为 /tmp 自动退出了 PATH 的路径。
    如果想永久的把 /tmp 加入到 /PATH 的路径下,
    输入命令 #vi /etc/profile
    然后在最后一行加入 PATH=$PATH:/tmp/
    然后保存退出。
    文件,目录管理

  • 删除 PATH 环境变量下 /tmp 路径
    给 PATH 重新赋值一下 执行命令:

#PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
  • 然后把 vi /etc/profile 的最后一行添加 PATH 路径删除即可。

二, 命令 cp

  1. 命令语法:
    cp [选项][来源文件][目的文件]

  2. 命令描述:
    cp 是 copy(即复制) 的简写

  3. 命令选项:
    -r: 如果要复制一个目录,必须加 -r 选项,否则不能复制
    -i:这是安全选项,如果遇到一个已存在的文件,会询问是否覆盖。

** 注:** 在用 cp 命令时,所有的目录全部末尾加上 "/"。cp 目录时,不会询问你是否覆盖,说明当目标目录已经存在的时候,它会把原目录直接放到目标目录下面去。如果目标目录不存在,它会把原目录 cp 过来,并改变一个名字。

三, 命令 mv

  1. 命令语法:
    mv[选项][源文件或目录][目标文件或目录]

  2. 命令描述:
    mv 是 move 的简写, 可以移动文件或者 重命名文件(语法为: mv [源文件名][修改后的文件名])

命令的几种情况:
- 目标文件是目录,但该目录不存在。
- 目标文件是目录,且该目标存在。
- 目标文件是文件,且文件不存在。
- 目标文件是文件,但该文件存在。

  • 当目标文件是目录时,其存在与否,执行后的结果不一样。如果该目录存在,则会把源文件或目录移动到该目录中。如果该目录不存在,则会把源文件重命名为给定的目标文件名。

  • 当目标文件是文件时,其存在与否,执行后的结果也是不一样的。如果该文件存在,则会询问是否覆盖。如果该文件不存在,则会把源文件重命名为给定的目标文件名。



文件或目录权限 chmod, 更改所有者所属组 chown

一, 文件或目录权限 chmod

Linux 文件属性

当我们用 ls -l 命令查看当前目录下的文件时,共显示了 9 列内容 (用空格划分列)。如图
文件,目录管理

第一列 包含文件的类型,所有者,所属组以及其他用户对该文件的权限。

其中第 1 位用来描述该文件的类型。我们看到这里的文件类型是 l,其实除了这个还有,b,c,s,d,- 等等。 

d 代表该文件是目录 
- 代表该文件是普通文件 
l 代表该文件是链接文件 
b 代表该文件是快设备,比如 /dev/sda 就是这样的文件,磁盘分区文件就是这种类型。 
c 代表该文件是串行端口设备文件 (又称字符设备文件),比如键盘,鼠标,打印机,tty 终端等都是这样的文件。 
s 代表该文件为套接字文件 (socket),用于进程之间的通信。


文件类型后面的 9 位,每 3 位为一组,其中 r 代表可读,w 代表可写,x 代表可执行。其中r 等于 4,w 等于 2,x 等于 1。前 3 位为 ** 所有者 (user)的权限,中间 3 位为所属组 (group)的权限,最后 3 位为其他用户 (others)** 的权限。

第二列 表示该文件占用的字节 (inode),如果是目录,那这个数值与该目录下是子目录数量有关。

第三列 表示该文件的所有者

第四列 表示该文件的所属组

第五列 表示该文件的大小。

第六列,第七列第八列 表示该文件最后一次被修改的时间,依次为月份,日期以及时间。

第九列 表示文件名。


命令 chmod

  1. 命令语法 
    chmod [-R] xyz 文件名 (这里的 xyz 表示数字)。

  2. 命令描述 
    命令 chmod(change mode) 用于改变用户对文件 / 目录的读写执行权限。

  3. 命令参数 
    -R 选项的作用等同于 chown 命令的 -R 选项,也表示级联更改。

注意: 在 Linux 系统中,一个目录的默认权限为 755,而一个文件的默认权限为 644。


命令示例:

    1. 修改 DL 的权限,该为 777。
      文件,目录管理
      在这里我们看到,虽然修改了 DL 的权限,但是 DL 下的 1.txt 的权限并没有改变。


  • 2. 如果想把目录下的子文件子目录全部批量的修改权限,可以加一个 -R 选项
    例如 使用 -R 选项,把 DL 权限修改为 770。
    文件,目录管理
    可以看出,在使用 -R 的选项的情况下,把 DL 的权限修改为 770,其子目录及子文件都跟随 DL 的权限修改为了 770。


  • 3. 使用字母的形式改变 DL 的权限为 747。
    文件,目录管理
    这里的 u 代表 user,g 代表 group,o 代表 other。


  • 4. 使用一条命令,DL 的把所有者,所属组,以及其他用户,都减去 X 权限。
    文件,目录管理
    其中,a 代表 all(全部),a-x, 代表把所有者,所属组,其他用户,的 x 权限去除。 
    当然 a+x 的意思是把所有者,所属组,其他用户,加上 x 权限。当然也可以 u-x,u+x,(只针对所有者)。


二, 更改所有者所属组 chown

命令 chown

  1. 命令语法 
    chown [-R] 账户名 文件名 或者 chown [-R] 账户名: 组名 文件名

  2. 命令描述 
    命令 chown 可以更改文件的所有者

  3. 命令选项 
    -R 选项只适用目录,作用是级联更改,即不仅更改当前目录,连目录里的目录或者文件也全部更改。
    文件,目录管理
    图片用到一个 useradd 命令,其作用是增加一个用户组。 
    在这里我们看到,在不用 -R 选项的情况下,更改 dir 的所有者,它的目录下的 test1 的所有者并没有改变。 
    然后使用 -R 选项更改 dir 的所有者后,其目录下的 test1 也跟随 dir 的所用者一同改变。


命令 chgrp

  1. 命令语法 
    chgrp [组名][文件名]

  2. 命令描述 
    命令 chgrp 可以更改文件的所属组
    文件,目录管理

  3. 图片中用到了一个 groupadd 命令,其作用是增加一个所属组。

  4. 命令选项 
    -R 选项只适用目录,作用是级联更改,即不仅更改当前目录,连目录里的目录或者文件也全部更改。作用同 chown 的 -R

小知识: 在我们使用 chown 的时候,可以连同,所属组,一起更改。中间用: 分割。如下图
文件,目录管理


umask 命令, 隐藏权限 chattr—lsattr

一, 命令 umask

默认情况下, 目录的权限值为 755,普通文件的权限值为 644。

  1. 命令语法 
    umask xxx(这里的 xxx 代表 3 个数字)。

  2. 命令描述 
    命令 umask 用于改变文件的默认权限。 
    如果要查看 umask 的值,只要在命令行输入 umask,然后回车即可。

文件,目录管理

这里 umask 的预设值为 0022,规则:

若用户建立普通文件,则预设没有可执行权限,只有 r,w 两个权限,最大值为 666(-rw-rw-rw-)。 
若用户建立目录,则预设所有权限均开放,即 777(-rwxrwxrwx)。 
umask 计算法:

例如我们把 umask 的值改为 003,那么它创建的普通文件 (最大值 666) 的权限是什么呢? 
普通文件的最大值 -umask 的值 = 将要创建的普通文件权限 
(rw-rw-rw-)-(——-wx)=rw-rw-r– 
可以看出是 666-003=664。

例如我们把 umask 的值改为 003,那么它创建的目录 (最大值 777) 的权限是什么呢? 
目录文件的最大值 -umask 的值 = 将要创建的目录权限 
(rwxrwxrwx)-(——-wx)=rwxrwxr– 
可以看出 777-003=774

注意在计算 umask 的时候不能用数字表示,只能用字母。

二, 隐藏权限 chattr—lsattr

修改文件的特殊属性

命令 chattr

  1. 命令语法 
    chattr [+-=][Asaci][文件或目录名] ,其中 +,-,= 分别表示增加,减少和设定。

  2. 命令描述 
    命令 chattr(chage attribute)改变属性的意思

  3. 命令选项 
    A 增加该属性后,表示文件或目录的 atime 将不可修改。 
    s 增加该属性后,会将数据同步写入磁盘中。 
    a 增加该属性后,表示只能追加不能删除,非 root 用户不能设定该属性。 
    c 增加该属性后,表示自动压缩该文件,读取时会自动解压。 
    i 增加该属性后,表示文件不能删除,重命名,设定链接,写入以及新增数据。

以上选项中,常用的为 a,i 这两个选项,举例说明用法如下:

选项 i

  • 从图中可以看出。给 dir 目录增加 i 权限后,即使是 root 账户,也不能再 dir 目录中创建或删除 test2 文件。
    文件,目录管理


选项 a

  • 从图中可以看出。dir 目录增加 a 权限后,只可以在里面创建文件,而不能删除文件。
    文件,目录管理


  • 从图中可以看出。dir/test1 增加 a 权限后,只能追加内容,不能替换内容。增加 i 选项后,既不能追加, 也不能替换。
    文件,目录管理

命令 lsattr

  1. 命令语法 
    lsattr [-aR] [文件 / 目录名]

  2. 命令描述 
    命令 lsattr 用于读取文件或者目录的特殊权限。

  3. 命令选项 
    -a 类似于 ls 的 -a 选项,即连同隐藏文件一同列出。 
    -R 连同子目录的数据一同列出。
    文件,目录管理


特殊权限之 set uid, 特殊权限之 set gid, 特殊权限之 sticky bit

一, 特殊权限之 set uid

权限说明:set uid 权限针对二进制可执行文件,使文件在执行阶段具有文件所有者的权限。比如 passwd 这个命令就具有该权限。当普通用户执行 passwd 命令时,可以临时获得 root 权限,从而可以更改密码。 
作用 :set uid 的作用是保证普通用户临时拥有该命令所有者的身份。给一个文件设置成 set uid,前提这个文件是一个二进制,可执行的文件。 
** 用法:** 把一个二进制可执行文件的,所有者的权限上 +s 就添加上了 set uid 权限。 
例如把 ls 命令设置成 set uid 。 #chmod u+s /usr/bin/ls


  • 在更改 root 密码的时候用到 passwd 命令,检查可执行命令 passwd 的路径。 
    如图可看出,权限所有者的权限是 rws, 而不是 rwx。 
    说明: 这里的 s 表示:当其他用户执行该命令的时候,赋予该用户临时 root 权限, 也就是 set uid
    文件,目录管理


  • 在 Linux 下,更改密码也就意味着要更改一个密码的文件,路径为:/etc/shadow 
    如图可以看出,这个文件的权限为 000。普通用户是访问不了的。
    文件,目录管理


  • 如何让普通用户能够更改自己的密码同时又没有写的权限呢。
    答: 使用普通用户 su 连接到 root 用户, 在 root 用户下把 ls 设置成 set uid 权限。
    具体步骤如下


  • 首先切换到一个普通用户下。

#su 用户名 //切换到user1用户下。

# whoami //查看当前用户
文件,目录管理

文件,目录管理


  • 当我们在普通用户的状态下,查看 root 的时候权限是不够的,需要在 root 用户下把 ls 权限设置成 set uid。

#chmod u+s /usr/bin/ls //在ls上添加set uid权限
文件,目录管理

注: #chmod u-s /usr/bin/ls //去除set uid权限


  • 把 ls 添加 set uid 权限后,在普通用户下就能查看 root 了。自然普通用户也就能修改密码而同时又没有写的权限了。
    文件,目录管理


二, 特殊权限之 set gid

set gid 不仅能作用在文件上,还能作用在目录上。 
权限说明: set gid 权限可以作用在文件上 (二进制可执行文件),也可以作用在目录上。当作用在文件上时,其功能和 set,uid 一样,它会使文件在执行阶段具有文件所属组的权限。目录被设置这个权限后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。 
作用: 
当作用在 文件 上的时候 ,其作用和 set uid 是类似的,它可以让执行这个文件的普通用户临时拥有所属组的身份。 
当作用在 目录 上的时候,创建子目录或子文件的所属组和该目录的所属组是保持一致的。 
用法: 把一个二进制可执行文件的,所属组的权限上 +s 就添加上了 set gid 权限。


  • 当作用在 文件 * 上的时候 ,其作用和 set uid 是类似的,它可以让执行这个文件的普通用户临时拥有所属组的身份。
  • 例如把 ls 命令设置成 set gid 。 #chmod g+s /usr/bin/ls 
    如图可见 ,所属组中的 x 变成了 s

文件,目录管理


  • 切换到普通用户下,一样可以进入到 /root 的子目录下 
    ![输入图片说明]
    文件,目录管理


  • 当作用在目录上的时候,创建子目录或子文件的所属组和该目录的所属组是保持一致的。
    例如: 我们把 123 目录添加 set gid 权限,然后更改所属组为 user1,然后在 123 目录下创建一个文件 dl,其 dl 的所属组为 user1。 如果没有添加 set gid 权限的话,dl 的所属组应该是 root。
    文件,目录管理


三, 特殊权限之 sticky bit

权限说明: 可以理解为防删除位。文件是否可以被某用户删除,主要取决于该文件所在的目录是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能删除,同时也不能添加新的文件。如果希望用户能够添加文件但不能删除该目录下其他用户的文件,则可以对父目录增加该权限。设置该权限后,就算用户对目录具有写权限,也不能删除其他用户的文件。 
作用: 防止别人删除自己的文件,root 用户除外。


  • 在这里我看到,/tmp 的其他用户的权限是 rwt,而不是传统的 rwx。这个叫做防删除位。
    文件,目录管理
    例如: 在 user1 用户下的 /tmp 目录下 创建一个 dl 文件(dl 的权限是默认的 644)时,在 dl 里面编辑一些内容。然后切换到 user2 用户下,在 user2 用户下只能查看 dl 文件,而不能更改(除 user1 用户和 root 用户拥有修改的权限,其他用户都不能修改)。


特殊权限总结

一个目录下的文件能不能删除,不取决于这个目录下的文件的权限,而是取决于这个文件所在目录的权限,是否可写。 所以当一个目录的 others 权限是可读可写时 (目录默认权限有可执行,因为打开目录,就相当于执行了该目录),其他人就可以删除这个目录下的任何文件,包括 root 文件。