[2] Centos 7.3 文件、目录管理

2.1 系统目录结构

  1. tree 树形列出目录结构

yum install -y tree

  1. 选择列出目录最大深度为2

tree -L 2

  1. 存放用户命令目录

/bin、/sbin、/usr/bin、/usr/sbin

  1. 详细目录介绍
/sbin       一般存放Root用户命令
/bin        存放普通用户命令
/boot       系统启动相关文件
/dev        linux系统相关设备文件,光盘、鼠标、键盘等
/etc        系统配置文件,网卡配置文件、ssh配置文件、selinux配置文件
/home       用户家目录
/lib、lib64 存放库文件,查看命令依赖的库:ldd /bin/ls
/media      媒介目录,插入U盘自动挂载至该目录
/mnt        临时挂载目录,可将光驱、新增设备挂载在该目录
/opt        主要存放可选程序,安装在/opt目录下的程序,所有的数据、库文件都会保存在该目录下
/proc       系统启动进程,每个进程对应PID
/run        进程产生的临时文件,关机重启后会消失
/srv        存放服务产生的相关文件
/sys        系统内核相关文件
/tmp        临时目录,权限很大
/usr        存放用户文件,比如/usr/bin、/usr/sbin。/usr/local编译安装的软件默认安装在此目录
/var        /var/log存放日志、/var/run某些进程PID所在目录

2.2 ls 命令

-i      查看inode号,inode包含时间、大小、文件存放区块位置等等属性
-l      文件详细信息
-h      选择合适的文件大小单位
-a      显示所有文件,包含隐藏文件或者目录
-d      显示当前文件夹,而并非文件夹下面的文件
-t      按照时间顺序排序
ll = ls -l
./      表示当前目录
../     表示当前目录上一级目录

2.3 文件类型

==d==rwxr-xr-x 2 root root 6 5月 30 21:27 123

-       表示普通文件、二进制文件
d       表示目录
c       表示字符串设备
l       表示软链接文件
b       表示块设备,光盘、磁盘
s       套接字文件,进程之间通信使用,如musql.sock

2.4 alias命令

  1. 查看命令别名

which ls or alias ls
2. 设置别名

alias gbj = ls -lha /root

  1. 取消别名

ualias gbj

2.5 相对路径和绝对路径

  • 绝对路径:从/目录开始的文件,无论在哪个目录都可以使用绝对路劲访问
  • 相对路径:相对绝对路径来说,从当前目录开始
  • 查看当前目录路径:pwd

2.6 cd命令

cd -            返回上次所在目录
cd ~            进入当前用户根目录
cd ..           进入上级目录

2.7 创建和删除目录

  1. mkdir 创建目录
date                        显示时间
mkdir /root/test            创建/root/test目录
mkdir -p /root/test/1/2/3   级联创建目录
mkdir -v                    可视化创建
  1. rmdir 只能删除非空目录
  2. rm 删除文件或者非空目录
-f              force强制删除文件,无须提示
-r              删除目录
-v              可视化删除

2.8 环境变量 PATH

  1. 查看命令别名和命令绝对路径

which
2. 全局更改PATH值,每次终端自动添加自定义变量

修改/etc/profile,添加 PTAH=$PATH:/目录

2.9 cp 命令

cp 源文件/目录 目的文件/目录

cp -r          用于拷贝目录

如果目标目录存在,则将源文件/目录放到目标目录中
如果目标文件不存在,则将源文件/目录改名后放置指定路径中

2.10 mv 命令

mv 源文件/目录 目标文件/目录

目标文件为目录,并且目标目录不存在,则将源目录重命名
目标文件为目录,并且目标目录存在,则将源目录移动目标目录中
目标文件不是目录,且不存在,则重命名源文件

2.11 文档查看命令

cat、tac、more、less、head、tail

cat -A              查看文档中所有字符
cat -n              显示文档行号
wc -l               查看行数
tac                 倒序查看文档内容
more                部分查看文档,空格键往下翻屏,ctrl+f网上翻页,ctrl+b往下翻页
less                部分查看文档,按空格键往下翻屏,ctrl+f往上翻页,ctrl+b往下翻页,shift+G定位行末、shift+g定位行首,/从当前页面从前往后搜索,?从当前页面从后往前搜索,n/N搜索内容后往前往后定位,支持方向键
head                查看文件开头10行 -n:指定数字
tail                查看文件尾部10行。-n:指定数字;-f:动态显示文档,一般用于动态查看某个文件。

2.12 chmod 文档或目录权限

chmod == change mode

root@centos7-1 ~]# ls -l
总用量 28
-rw-r--r--  1 root root 13244 5月  30 23:05 1
drwxr-xr-x  2 root root     6 5月  30 21:27 123
  • 权限位
rw-r--r-- == 属主 属组 其他
r = 可读
w = 可写
x = 可执行
  • 数字权限位表示
r = 4
w = 2
x = 1

rw-r–r– == 644

  • chmod 权限更改

Each MODE is of the form ‘[ugoa]*( -+=)+|[-+=][0-7]+’.

更改文件1权限为rwx------            chmod 700 1
更改文件1权限为rwx------            chmod u=rwx,g=,o= 1
更改文件1权限为rwxrwxrwx            chmod a=rwx 1
去除文件1可执行权限                 chmod a-x 1

chmod -R                            级联更改目录及目录下所有子目录和文件所有文件权限
  • 特殊点
[root@centos7-1 ~]# ls -l /tmp/

总用量 12

drwx - - - - - -**.** 2 root root    6 5月  29 17:27 akonadi-root.f3NFIq

-rw-r- -r- -**.** 1 root root 1018 5月  29 17:23 anaconda.log

**.**         表示该文件受制于selinux,关闭后重启设备,不再生成该类型文件

2.13 chown 更改属主和属组

chown == change owner

  • 查看系统用户
cat /etc/passwd
  • 更改文件1 属主为gbj
[root@centos7-1 ~]# chown gbj 1
  • 更改文件属组为gbjgp

chgrp == change group

[root@centos7-1 ~]# chgrp gbjgp 1

[root@centos7-1 ~]# chown :gbjgp 1
  • 更改文件1属主为gbj,属组为gbjgp
[root@centos7-1 ~]# chown gbj:gbjgp 1
  • chown -R

级联更改目录及目录下所有子目录和文件所有文件gbj属主、root属组

chown -R gbj:root 123/

2.14 umask值

登录系统之后创建一个文件总是有一个默认权限的。umask设置了用户创建文件的默认权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。一般可在/etc/profile

  • 默认权限值\

系统默认root用户umask值为022,最前面0表示set Uid、set Gid、粘着位(sticky)、有效的设定值只有后三位数。
在 bash中,虽然可带入四位数字,但第一个数字,必须为 0。

[root@Temence ~]# umask 
0022

默认创建文件权限 644 ,文件完全权限为666 默认创建目录权限 755 ,目录权限权限为777

  • umask值定义文件/etc/profile
# By default, we want umask to get set. This sets it for login shell
 # Current threshold for system reserved uid/gids is 200
 # You could check uidgid reservation validity in
 # /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
    umask 002
else
    umask 022
fi

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done
  • 更改umask值
  • 更改定义文件 /etc/profile
  • umask 003

umask值定义的文件默认权限不能单纯的认为是完全权限减去umask值,需要逐位相减。比如:

666-003 =
(rw-rw-rw-)-(-------wx) =
rw-rw-r-- =
664

2.15 隐藏权限lsattr、chattr

+ :在原有参数设定基础上,追加参数。
- :在原有参数设定基础上,移除参数。
= :更新为指定参数设定。
A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
S:硬盘I/O同步选项,功能类似sync。
a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
d:即no dump,设定文件不能成为dump程序的备份目标。
i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件系统的安全设置有很大帮助。
j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
s:保密性地删除文件或目录,即硬盘空间被全部收回。
u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。
  • 设置1.txt i 权限

i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件系统的安全设置有很大帮助。

[root@centos7-1 ~]# ll 1.txt 
-rw-r--r-- 1 root root 0 6月   7 22:58 1.txt
[root@centos7-1 ~]# chattr +i 1.txt 
[root@centos7-1 ~]# ll 1.txt 
-rw-r--r-- 1 root root 0 6月   7 22:58 1.txt
[root@centos7-1 ~]# cat 1.txt 
[root@centos7-1 ~]# lsattr 1.txt 
----i----------- 1.txt
[root@centos7-1 ~]# touch 1.txt
touch: 无法创建"1.txt": 权限不够
  • 设置1.txt a 权限

a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。

[root@centos7-1 ~]# lsattr 1.txt
---------------- 1.txt
[root@centos7-1 ~]# chattr +a 1.txt 
[root@centos7-1 ~]# lsattr 1.txt 
-----a---------- 1.txt
[root@centos7-1 ~]# rm -f 1.txt 
rm: 无法删除"1.txt": 不允许的操作
[root@centos7-1 ~]# echo 'test' >> 1.txt 
[root@centos7-1 ~]# cat 1.txt 
test

设置a权限后,可以追加、可以更改时间信息、不能更改文件内容、不能重命名、不能删除

  • lsattr 查看隐藏权限

lsattr 文件/目录,查看目录本身需要使用-d参数。

[root@centos7-1 ~]# ls
1    1.t    anaconda-ks.cfg       passwd  模板  图片  下载  桌面
123  1.txt  initial-setup-ks.cfg  公共    视频  文档  音乐
[root@centos7-1 ~]# lsattr -d 123
---------------- 123
  • chattr 设置隐藏权限

chattr -R files
-R 级联修改目录及目录下面的文件隐藏权限
更改目录权限时,如果不使用-R参数,目录下的文件或者目录不会拥有隐藏权限,文件依旧可以追加更改,但不能删除


目录添加

a权限,使用和不使用-R参数区别:

[root@centos7-1 ~]# lsattr -d test/
---------------- test/
[root@centos7-1 ~]# lsattr  test/1
---------------- test/1
[root@centos7-1 ~]# chattr +a test/
[root@centos7-1 ~]# lsattr test/
---------------- test/1
[root@centos7-1 ~]# lsattr -d test/
-----a---------- test/
[root@centos7-1 ~]# echo 'qwer' > test/1 
[root@centos7-1 ~]# rm test/1
rm:是否删除普通文件 "test/1"?y
rm: 无法删除"test/1": 权限不够

[root@centos7-1 ~]# chattr +a -R test/
[root@centos7-1 ~]# lsattr test/
-----a---------- test/1
[root@centos7-1 ~]# lsattr -d test/
-----a---------- test/
[root@centos7-1 ~]# echo 'wer' > test/1 
-bash: test/1: 不允许的操作
  • 目录添加==i==权限,使用和不使用-R参数区别:
[root@centos7-1 ~]# lsattr -d test/
---------------- test/
[root@centos7-1 ~]# lsattr  test/2
---------------- test/2
[root@centos7-1 ~]# chattr +i test/
[root@centos7-1 ~]# lsattr test/
---------------- test/1
---------------- test/2
[root@centos7-1 ~]# lsattr -d test/
----i----------- test/
[root@centos7-1 ~]# echo 'qwer' > test/2
[root@centos7-1 ~]# cat test/2
qwer
[root@centos7-1 ~]# rm test/2
rm:是否删除普通文件 "test/2"?y
rm: 无法删除"test/2": 权限不够

[root@centos7-1 ~]# chattr -R +i test/
[root@centos7-1 ~]# lsattr -R test/
----i----------- test/1
----i----------- test/2
[root@centos7-1 ~]# lsattr -d test
----i----------- test
[root@centos7-1 ~]# echo 'asdf' > test/2
-bash: test/2: 权限不够
[root@centos7-1 ~]# cat test/2
qwer

2.15 特殊权限set_uid

让普通用户可以以root用户的角色运行只有root帐号才能运行的程序或命令

  • 查看set_uid
    保证普通用户临时拥有该命令所有者的身份

[root@Temence ~]# ll /usr/bin/passwd
-rw s r-xr-x 1 root root 27832 Jun 10 2014 /usr/bin/passwd

  • 设置set_uid
[root@centos7-1 ~]# cp /bin/ls .
[root@centos7-1 ~]# ls
1    1.t    anaconda-ks.cfg       ls      test  模板  图片  下载  桌面
123  1.txt  initial-setup-ks.cfg  passwd  公共  视频  文档  音乐
[root@centos7-1 ~]# chmod u+s ls
[root@centos7-1 ~]# ll ls
-rwsr-xr-x 1 root root 117656 6月   8 07:29 ls
  • 取消set_uid
[root@centos7-1 ~]# chmod u-s ls
[root@centos7-1 ~]# ll ls
-rwxr-xr-x 1 root root 117656 6月   8 07:29 ls
  • 使用chmod u=rws设置set_uid
[root@centos7-1 ~]# chmod u=rws ls
[root@centos7-1 ~]# ll ls
-rwSr-xr-x 1 root root 117656 6月   8 07:29 ls

此时ls属主权限位变成S,而不是s。是因为没有可执行的权限,但是此时仍然ls命令,有两个原因:
1.root拥有s权限,s有一层可执行含义。
2.普通用户其他权限位有可执行权限

bash
[root@centos7-1 ~]# chmod u+x ls
[root@centos7-1 ~]# ll ls
-rwsr-xr-x 1 root root 117656 6月 8 07:29 ls

2.16 特殊权限set_gid

让普通用户组可以以root用户组的角色运行只有root帐号才能运行的程序或命令

  • 设置set_gid

Set_gid权限如果给文件设置,是让运行此文件的其它用户具有这个文件的属组特性;==给目录设置Set_gid权限,任何用户在该目录下创建的文件,则该文件属组都和目录的属组一致。==

[root@centos7-1 ~]# ll ls
-rwxr-xr-x 1 root root 117656 6月   8 07:29 ls
[root@centos7-1 ~]# chmod g+s ls
[root@centos7-1 ~]# ll ls
-rwxr-sr-x 1 root root 117656 6月   8 07:29 ls
[root@centos7-1 ~]# ll -d 123
drwxr-xr-x 2 root root 6 5月  30 21:27 123
[root@centos7-1 ~]# chown :gbj 123/
[root@centos7-1 ~]# ll -d 123
drwxr-xr-x 2 root gbj 6 5月  30 21:27 123
[root@centos7-1 ~]# touch 123/1
[root@centos7-1 ~]# ll 123/1 
-rw-r--r-- 1 root root 0 6月   8 07:56 123/1
[root@centos7-1 ~]# chmod g+s 123/
[root@centos7-1 ~]# ll -d 123
drwxr-sr-x 2 root gbj 15 6月   8 07:56 123
[root@centos7-1 ~]# touch 123/2
[root@centos7-1 ~]# ll 123
总用量 0
-rw-r--r-- 1 root root 0 6月   8 07:56 1
-rw-r--r-- 1 root gbj  0 6月   8 07:59 2

**设置目录set_gid之后,在目录下创建子文件和子目录,创建的子文件和子目录属主会和父目录属主保持一致**

2.17 特殊权限stick_bit

  • /tmp 目录权限

任何一个用户都可在/tmp目录下写文件,其他用户可读,但是无法编辑、删除。针对目录来说的,如果该目录设置了stick_bit,则该目录下的文件除了该文件的创建者和root用户可以删除和修改,其他用户均无法编辑删除。

[root@Temence ~]# ll -d /tmp
drwxrwxrwt 7 root root 4096 Jun  2 10:50 /tmp
  1. 一个文件或者是否可写可删除,不在于自己本身权限,而是在于其父目录是否具有可写权限
  2. 特殊权限使用数字表示:
    set_uid=4
    set_gid=2
    stick_bit=1
    例如:4755权限表示,属主有特殊s权限(set_uid),属主可读可写可执行、属组可读可执行不可写、其他用户可读可执行不可写。当拥有可执行权时,此时s为小写,如果没有可执行全,此时S为大写。

2.18 软链接文件

符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接==不同文件系统==的文件
- 软链接文件 usr/bin

[root@centos7-1 ~]# ls -l /bin
lrwxrwxrwx. 1 root root 7 5月  29 16:44 /bin -> usr/bin
  • 创建软链接
ln -s 源文件 软链接文件

创建软链接文件时,如果源文件和软链接文件在同一目录,可以使用相对路径。

用例:

系统/data目录磁盘不够,但是www服务需要一直使用/data目录中数据,此时可以将/data/www/目录mv至空间大的目录中,然后将mv的/www目录软链接至/data中。

2.19 硬链接文件

硬链接==只能在同一文件系统==中的文件之间进行链接,不能对目录进行创建。如果删除硬链接对应的源文件,则硬链接文件仍然存在

  • 创建硬链接
ln 源文件 硬链接文件

2.20 快捷键使用

ctrl + a            快速将光标移至行首
ctrl + e            快速将光标移至行尾
ctrl + l            清除当前屏幕内容
ctrl + c            取消当前输入
crtl + u            删除当前光标前面内容
ctrl + k            删除当前贯标后面内容
ctrl + d            当前命令行有内容,就会从光标往后一格一格删除,如果没有内容就会退出当前终端。

2.21 find 命令

关于搜索文件命令还有:which、whereis、locate(yum安装 mlocate,更新库updatedb)

语法:find [搜索路径] [搜索条件],支持通配符搜索

  • 常用搜索条件
-atime +n/-n        访问或执行时间大于/小于 n 天的文件
-ctime +n/-n        写入、更改 inode 属性(例如更改所有者、权限或者链接)时间大于/小于 n 天的文件
-mtime +n/-n        写入时间大于/小于 n 天的文件
-name filename      直接查找该文件名的文件,这个选项使用很多
-type filetype      通过文件类型查找。文件类型在前面部分已经简单介绍过,相信你已经大体上了解了。filetype包含了f、 b,、 c、 d、 l、 s 等
-size               搜索文件大小
-inum               搜索指定inode号
-exec               一般查找出来内容需要进一步的操作,参数后面跟的是command命令,{}代表前面find查找出来的结果。exec以;为结束标志的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠转义。
  • -name 搜索条件
搜索passwd文件所在路径:
[root@Temence ~]# find / -name passwd
/etc/pam.d/passwd
/etc/passwd
/usr/bin/passwd

[root@Temence ~]# find / -name passw?
/etc/pam.d/passwd
/etc/passwd
/usr/bin/passwd
[root@Temence ~]#
  • -type 搜索条件
搜索123名称的目录:
[root@Temence ~]# find / -type d -name 123
/data/123
  • -atime、ctime、mtime搜索条件
Access time也就是atime              是在读取文件或者执行文件时更改的。
Modified time也就是mtime            是在写入文件时随文件内容的更改而更改的。
Create time也就是ctime              是在写入文件、更改所有者、权限或链接设置时随inode的内容更改而更改的。
  • stat命令可用来列出文件的atime、ctime和mtime。
  • atime不一定在访问文件之后被修改,因为:
    这三个time属性值都放在了inode中。若mtime、atime修改inode就一定会改,既然inode改了,那ctime也就跟着要改了。
更改时间在一天以内后缀为.conf的所有文件:
[root@Temence ~]# find / -type f -ctime -1 -name "*.conf"
/run/systemd/system/session-296801.scope.d/50-SendSIGHUP.conf
/run/systemd/system/session-296801.scope.d/50-After-systemd-user-sessions\x2eservice.conf
/run/systemd/system/session-296801.scope.d/50-After-systemd-logind\x2eservice.conf
/run/systemd/system/session-296801.scope.d/50-Description.conf
/run/systemd/system/session-296801.scope.d/50-Slice.conf
/run/systemd/system/session-296542.scope.d/50-SendSIGHUP.conf
/run/systemd/system/session-296542.scope.d/50-After-systemd-user-sessions\x2eservice.conf
/run/systemd/system/session-296542.scope.d/50-After-systemd-logind\x2eservice.conf
/run/systemd/system/session-296542.scope.d/50-Description.conf
/run/systemd/system/session-296542.scope.d/50-Slice.conf

更改时间在一天以内或者文件后缀为.txt的文件:
[root@Temence ~]# find / -ctime -1 -o -name "*.txt"
  • 使用find命令查找硬链接文件
1. 创建新的硬链接文件:
[root@Temence ~]# ln 1.txt /tmp/1.txt.bak

2. 查看此时源文件inode值:
[root@Temence ~]# ll 1.txt 
-rw-r--r-- 2 root root 0 Jun  7 10:55 1.txt
[root@Temence ~]# ls -i 1.txt 
23502493 1.txt

3. 使用-inum查找两个硬链接文件:
[root@Temence ~]# find / -inum 23502493
/root/1.txt
/tmp/1.txt.bak
  • -mmin搜索条件
1. 查找root目录200分钟以内修改过的文件:
[root@Temence ~]# find /root/ -type f -mmin -200
/root/1.txt
/root/.viminfo
  • -exec 参数
1. 查找root目录200分钟以内修改过的文件,并且将文件详细属性列出:
[root@Temence ~]# find /root/ -type f -mmin -200 -exec ls -l {} \;
-rw-r--r-- 2 root root 48 Jun  9 22:40 /root/1.txt
-rw------- 1 root root 3853 Jun  9 22:40 /root/.viminfo

2.查root目录找200分钟以内修改过的文件,并且将文件重命名{}.bak:
[root@Temence ~]# find /root/ -type f -mmin -200 -exec mv {} {}.bak \;
[root@Temence ~]# ll
total 4
-rw-r--r-- 2 root root 48 Jun  9 22:40 1.txt.bak
-rw-r--r-- 1 root root  0 Jun  1 20:10 test
  • size 搜索条件
查找/目录下大于10M的文件:
[root@Temence ~]# find / -size +10M -type f
find: '/proc/2273/task/2273/fdinfo/6': No such file or directory
find: '/proc/2273/fdinfo/6': No such file or directory
/usr/lib/locale/locale-archive
/var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
/var/cache/yum/x86_64/7/updates/gen/primary_db.sqlite
/var/lib/rpm/Packages

2.21 文件命后缀

  1. linux区分大小写
  2. linux文件有后缀名,但是区别于windows后缀,类似于文件标记。文件名后缀可自定义。
  3. date查看日期
  4. LANG语言:echo $LANG

2.22 Linux和Windows 互传文件

方法有很多,比如ftp、samba服务器,这里使用的是lrzsz工具,无法在putty下使用。

[root@Temence ~]# yum install -y lrzsz
  • 从linux下载文件至windows
[root@centos7-1 ~]# sz 1.txt
  • 从windows上传文件至linux
[root@centos7-1 ~]# rz -be 1.txt

-b 以二进制方式,默认为文本方式。
-e 对所有控制字符转义。
如果要保证上传的文件内容在服务器端保存之后与原始文件一致,最好同时设置这两个参数