【Linux命令】《鸟哥Linux基础》第六章 Linux文件与目录管理
第六章 Linux文件与目录管理
6.1 目录操作
. 当前目录
.. 上层目录
- 前一个工作目录
~ 当前用户的家目录
~account account用户的家目录
cd 绝对路径or相对路径 切换到这个指定路径
cd 不加任何路径,是回到当前家目录,等于cd ~
cd - 返回刚刚的上个目录
pwd 直接就能显示当前目录
pwd -P 显示链接文件的真身
mkdir test 创建test文件夹,默认权限
mkdir -m 711 test2 创建一个test2文件夹,权限为711
mkdir -p test/test1/test2 递归创建子文件夹
rmdir test 直接删掉空文件夹,如果test有内容则无法删除
rmdir -r test 直接删掉test,不管test内有无内容
rmdir -p test/test1/test2 递归删除,包括空文件夹
PATH
PATH="${PATH} : /root" 将/root文件夹加入到PATH路径中
从安全角度考虑,本目录(.)最好不要放到PATH中
6.2 文件与目录管理
ls cp rm mv basename dirname
ls 显示文件属性
ls [-aAdfFhilnrRSt] 文件或目录名称
-a 全部文件,包括隐藏文件
-d 仅列出目录本身,而不是列出目录内的文件数据
-l 详细信息显示,包含文件的属性与权限等数据
ls [--color={never,auto,always}] 文件或目录名称
--color=never 不要依据文件特性给与颜色显示
--color=auto 你自己看着显示
--color=always 要依据文件特性给与颜色显示
ls [--full-time] 文件或目录名称
--full-time 以完整时间输出,年月日时分
--time={atime,ctime} 输出access时间(atime),或改变权限属性的时间(ctime)
cp 复制文件或目录
cp [-adfilprsu] 源文件source 目标文件directory
-a 相当于-dr --preserve=all 整个数据特性完全一模一样
-d 若源文件为链接,则复制链接而非文件本身
-r 递归复制,用于目录的复制
-i 若目标文件已经存在,覆盖时会先询问操作的进行
-p 连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性,备份时常用
-l 进行硬链接的链接文件建立,而非复制文件本身
-s 复制成符号链接文件,也就是快捷方式文件
-u 当destination比source旧,才更新destination;或者destination不存在,才会复制过来,备份常用
--preserve=all 除了-p的权限相关参数外,还加入SELinux的属性,links、xattr等也复制
cp [options] source1 source2 source3 ... directory
这里需要注意,如果源文件有两个以上,最后一个目标文件一定得是目录
拷贝之前了解:
是否需要完整保留源文件的信息
源文件是否为符号链接文件
原文件是否为特殊文件,如FIFO、Socket
源文件是否为目录
rm 删除文件或目录
rm [-fir] 文件名或目录名
-f 就是force,忽略不存在的文件,不会出现警告信息
-i 交互模式,删除前询问是否删除
-r 递归删除,极其危险,慎用!
rm 非空文件夹 会提示说里面有内容,删不掉
rm -r 非空文件夹 按照提示删除就行了
\rm -r 文件夹 命令前面加个反斜线,可以忽略掉alias的指定选项
rm ./-aaa- 删除一个-开头的文件,加上./表示-aaa-是本目录下的文件
rm -- -aaa- 此法也可以删除-aaa-
mv 移动文件或目录,或重命名
mv [-fiu] source destination
-f fource强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i 若目标文件已经存在,询问是否覆盖
-u 若目标文件已经存在,且source比较新,才会更新
mv 源文件a.txt 目标文件b.txt 实现将单一文件a.txt重命名为另一文件b.txt
mv [option] source1 source2 source3 ... directory 多个文件移到目录中
获取路径的文件名与目录名
basename /etc/sysconfig/network 获取最后的文件名network
dirname /etc/sysconfig/network 获取最开始的目录名/etc/sysconfig/
6.3 文件内容查看
cat tac nl more less head tail od touch
cat 从第一行开始显示文件内容
cat [-AbEnTv]
-A 相当于-vET,可列出一些特殊字符而不是空白而已
-b 列出行号,仅针对非空白行做行号展示,空白行不标行号
-E 将结尾的换行符$显示出来
-n 打印行号,连同空白行也会有行号,与-b不同
tac 从最后一行开始显示,是cat倒着写
tac 文件名
nl 显示的时候,同时显示行号
nl [-bnw] 文件名
-b 指定行号指定的方式,主要有两种
-b a 不论是否为空行,列出行号
-b t 如果有空行,空的那行不要列出行号(默认值)
-n 列出行号表示方法,主要3种
-n ln 行号在屏幕的最左方显示
-n rn 行号在自己栏位的最右方显示,且不加0
-n rz 行号在自己栏位的最右方显示,且加0
-w 行号栏位占用的字符
-w 3 表示默认栏位是3位
more 一页一页显示文件内容,翻页查看
可用按键:
space: 向下翻一页
Enter: 向下翻一行
/字符串:在这个显示的内容当中,向下查找字符串这个关键词
:f :立刻显示出文件名以及目前显示的行数
q: :立刻离开more,不再显示该文件内容
b或者[ctrl]-b :往回翻页,这个操作只对文件有用,对管道无用
less 可以往前翻页
可用按键:
space: 向下翻一页
[pagedown]:向下翻一页
[pageup]: 向上翻一页
/字符串: 向下查找字符串这个关键词
?字符串: 向上查找字符串这个关键词
n: 重复前一个查找(与/或?命令有关)
N: 反向重复前一个查找(与/或?命令有关)
g: 前进到这个数据的第一行
G: 前进到这个数据的最后一行(注意大小写)
q: 离开less
head 只看前面几行
head [-n number] 文件
-n 后面接数字,代表显示几行
-n 10 显示前10行(默认)
-n -100 如果数字是负数,表示后面的100行都不打印,只打印前面的所有内容
tail 只看后面几行
tail [-n number] 文件
-n 后面接数字,代表显示几行
-n 10 只显示后10行(默认)
-n 20 只显示后20行
-n +100 从100行以后的内容全部列出
-f 表示持续刷新显示后面所接文件中的内容,要等到按下Ctrl+c才结束;有数据写入时就显示
显示文件的第11到第20行(先取前20行,在此基础上再取后10行)
head -n 20 filename | tail -n 10
列出正确的行号,显示文件的第11到第20行(先给全文添加行号,取前20行,在此基础上再取后10行)
cat -n filename | head -n 20 | tail -n 10
od 以二进制的方式读取文件内容
od [-t TYPE] 文件
-t a 利用默认的字符来输出
-t c 使用ASCII字符输出
-t d[size] 利用十进制(decimal)输出数据,每个整数占size字节
-t f[size] 利用浮点数(floating)输出数据,每个数占size字节
-t o[size] 利用八进制(octal)输出数据,每个整数占size字节
-t x[size] 利用十六进制(hexadecimal)输出数据,每个整数占size字节
echo password | od -t oCc 自助查询password这几个字母对应的ASCII对照
文件3个时间:
修改时间 mtime 文件内容改变 (默认ls列出这个修改时间mtime)
状态时间 ctime 权限和属性改变
读取时间 atime 被新访问了
touch 修改文件时间或创建新文件
touch filename 创建了一个空文件
touch [-acdmt] 文件
-a 仅自定义atime
-c 仅修改文件的时间,若该文件不存在则不建立新文件
-d 后面可以接欲自定义的日期而不用目前的时间,或者--data="日期或时间"
-m 仅自定义mtime
-t 后面可以接欲自定义的日期而不用目前的时间, 格式为[YYYYMMDDhhmm]
touch -d "2 days ago" filename 将atime和mtime改成2天前,ctime未变
touch -t 202005251629 filename 将atime和mtime改成指定时间,ctime未变
6.4 文件与目录的默认权限与隐藏权限
将root的~/.bashrc文件复制给dj:
cp ~/.bashrc ~dj/bashrc 复制文件
chown dj:dj ~dj/bashrc 修改属性
建立一个目录,所有人都可以访问目录中的文件,但是只有dj用户可以修改这些文件:
应该建立的文件夹权限:drwxr-xr-x 755
mkdir /tmp/dirname 建立目录
chown -R dj:dj /tmp/dirname 修改属性
chmod -R 755 /tmp/dirname 修改权限
umask 负责制定当前用户在建立文件或目录时候的默认权限
umask 得到0022,与普通权限相关的是后三个数字022,拿掉0,2,2
umask -S 得到以符号形式显示的权限:u=rwx,g=rx,o=rx
umask 002 只将组外人拿掉一个写权限
chattr 在ext2 ext3 ext4的linux传统文件系统上面可以生效,xfs文件系统对其支持不全[Aadis]
chattr [+-=] [ASacdistu] 文件或目录名称
a 这个文件只能追加数据,不能删除也不能修改,
只有root能设置该属性
i 可以让一个文件不能被删除、改名,设置链接,也无法写入或
新增数据,有利于系统安全,只有root能修改该属性
s 如果改文件被删除,就会完全从硬盘删除,误删完全无法恢复
u 与s相反,如果文件被删除,数据内容还存在磁盘中,可以用来恢复该文件
lsattr [-adR] 文件或目录
-a 将隐藏文件的属性也显示出来
-d 如果接的是目录,仅列出目录本身的属性,而非目录内的文件名
-R 连同子目录一同列出来
chattr +aiS attrtest 使用chattr设置属性
lsattr attrtest 使用lsattr查看属性
特殊权限介绍:
SUID 不可针对目录
仅对二进制程序有效,不可用在shell脚本上,
执行者对于该程序需要有x的可执行权限,
本权限只在执行程序过程中有效,
执行者将具有该程序拥有者的权限
例如:一般用户可以修改自己的密码
只有root用户可以读取保存密码的/etc/shadow文件内容,并强制写入数据
又因/usr/bin/passwd命令的权限是-rwsr-xr-x,文件所有者权限有s
dj用户可以调用passwd命令,执行过程中拥有root所有权限,
成功向/etc/shadow文件写入数据
cat 命令没有这个s,因此无法在调用cat过程中享有root的权限,
因此无法使用cat查看/etc/shadow文件内容
SGID 既可以针对文件,又可针对目录
对于文件来说:
对二进制程序有用
程序执行着对于该程序来说,需要具备x的权限
执行者在执行过程中获得该程序用户组的支持
例如:
当文件mlocate.db文件的属性:-rw-r-----,
按理说组外人无法查看内容
而普通用户dj,可以调用/usr/bin/locate命令查找这个理论上
根本无法查看的mlocate.db
因为locate命令的属性:-rwx--s--x,在文件所属组中的x上是个s,
也就是,即使非本组人员执行这个命令,
那么恭喜你,你就具有这个命令所属组的权限,
这个命令所属的组是root,root组用户可以查看mlocate.db文件,
因此查询成功
对于目录来说:
若用户对于此目录具有r或x权限时,该用户能够进入该目录
用户在此目录下的有效用户组,将会变成该目录的用户组
用途:若用户在此目录下具有w的权限(可以新建文件),
该文件的用户组与此目录的用户组相同
SBIT 不可针对文件
如果用户对此目录具有w、x的权限,即具有写入权限
当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除该文件
例如:
用户dj对于A目录具有用户组或其他人的身份,并拥有目录w权限,
这表示dj用户对A目录内任何人建立的目录或文件具有删除、改名、移动等操作
但是,如果把A目录权限加上了SBIT权限,
则dj用户只能对自己建立的文件删除、改名、移动等,无法删除他人文件
例如:
/tmp目录的权限是:drwxrwxrwt,最后组外人的权限中有个t
任何人都可以在/tmp文件夹下新增修改文件,
但仅有该文件/目录建立者和root能删除自己的目录或文件
特殊权限设置:
4 SUID
2 SGID
1 SBIT
chmod 4755 filename 将一个文件权限改为-rwsr-xr-x SUID
chmod 6755 filename 将一个文件权限改为-rwsr-sr-x SUID+SGID
chmod 1755 filename 将权限改为-rwxr-xr-t SBIT
chmod 7666 filename 将权限改为-rwSrwSrwT 根本不具备w,都是空
file 查看文件类型:
属于ASCII文件、数据文件、二进制文件
有没有用到动态链接库等信息,可以利用file来看
file filename
6.5 命令与文件查找
脚本文件的查找:
which 查找执行文件
which [-a] commod
-a 将所有由PATH目录中可以找到的命令均列出,
而不止第一个被找到的命令名称
which config
which which
which history 找不到,因为which是查找【path】这个环境变量所规定的路径
而history是bash内置的命令,得通过type找
文件查找:
whereis 只查找特定目录下的文件
whereis [-bmsu] 文件或目录名
-l 可以列出whereis会去查询的几个主要目录
-b 只找binary格式的文件,二进制文件
-m 只找在说明文件manual路径下的文件
-s 只找source源文件
-u 查找不在上述三个项目中的其他特殊文件
whereis ifconfig 列出与ifconfig有关的文件名
whereis passwd
whereis -m passwd
whereis -l 可以列出whereis命令到底查询了哪些文件夹
主要在/bin、/sbin目录和/usr/share/man目录里查找
locate 只查找已建立的数据库/var/lib/mlocate
locate [-irclS] keyword 关键字检索
-i 忽略大小写的差异
-c 不输出文件名,仅计算找到的文件数量
-l 仅输出几行,若-l 5 则只输出前5行
-S 输出locate所用的数据库文件的相关信息,包括该数据库记录的文件目录数量等
-r 后面可接正则表达式的显示方式
locate -l 5 passwd
locate -S
locate查询基于建立的数据库,
但数据库每天才更新一次,如果新建了一个文件,这个文件自然一时半会不在数据库内,
需要手动更新数据库,否则会提示找不到数据
updatedb 这个命令是用来更新数据库,根据 /etc/updatedb.conf的设置
去查找系统硬盘内的文件,
并更新/var/lib/mlocate内的数据库文件
由于要去硬盘里查找文件名,最后更新整个数据库,要等数分钟
find
1、
find [PATH] [option] [action]
与时间有关的选项:-atime,-ctime,-mtime
-mtime n: n是数字,在n天之前的【一天之内】被修改过内容的文件
[n-1,n]
-mtime +n: 列出在n天之前(不含n天本身)被修改过内容的文件
(负无穷,n-1]
-mtime -n: 列出在n天之内(含n天本身)被修改过内容的文件
[n,现在]
-newer file:file为一个存在的文件,列出比file还要新的文件
find / -mtime 0 列出过去系统上面24h内修改过内容的文件,
0表示当前,从现在开始往前推24h
find / -mtime 3 列出3天之前那一天的24小时内修改过内容的文件
find /etc -newer /etc/passwd 列出/etc下面的文件,如果文件日期比/etc/passwd新就列出
2、
find /home -user dj 找出dj用户的在系统中的所有数据
find / -nouser 找出不太正常的文件,
列出这些不属于系统任何用户的文件,以源代码自行编译软件时会出现这种情况;
删除了一个用户,这个用户曾在系统留下很多文件时也会出现这种情况
3、
find -name filename 查找文件名为filename的文件
find -size [+-]SIZE 查找比SIZE还要大(+)或小(-)的文件,
SIZE规格:c:Bytes;k:1024Bytes;
find -size +50k 找到大于50kb的文件
find -type TYPE 查找文件类型是TYPE的,类型主要有:
一般正规文件 f
设备文件 b,c
目录 d
链接文件 l
socket s
FIFO p
find -perm mode 查找权限==mode的文件
find -perm -mode 列出的文件权限必然要能囊括这个mode
find -perm /mode 查找文件权限中包含任一mode的权限的文件
find / -name passwd 找出文件名为passwd的文件
find / -name "*passwd*" find只能查找完整文件名,若查找关键字,用正则
find /run -type s 找出socket文件,-type有利于找出类型怪异的文件
find / -perm /7000 所谓7000:---s--s--t,只要含有s或t就列出
find / -perm -7000 必须同时含有s或t,---s--s--t,才列出
find /usr/bin /usr/sbin -perm /6000 这两个文件夹中只要有SUID或SGID就列出
find会递归查找子目录
4、
find [PATH] [option] [action] 这个action
-exec commod 接额外别的命令处理找到的结果
-print 将结果打印输出到屏幕(默认)
find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
此处只能用命令本名ls -l,不可用命令别名ll
find / -size +1M 找出系统中大于1MB的文章
find /etc -name '*http*' 找出/etc下面的文件名包含http的文件
不要有事没事用find,它很消耗硬盘资源,可以用whereis和locate
6.6 权限与命令的关系
什么命令 在什么权限下才能够运行
1、
让用户能进入某目录并查看目录中有哪些文件的基本权限:
cd 目录
用户首先要能进入这个目录,对这个目录要有x权限
额外,如果要在这个目录内ls查看文件名,则要求用户对这个目录还需要r权限
2、
用户在某个目录内,读取一个文件的基本权限:
cat 或 more 或 less 等
用户首先要能进入这个目录,对这个目录要有x权限
用户想读这个文件内容,对这个文件要有r权限
3、
让用户可以修改一个文件的基本权限:
用 nano 或 gedit 或 vi 等
用户首先要能进入这个目录,对这个目录要有x权限
用户想要修改这个文件,要能看到文件内容(r),要能修改内容(w)
4、
让用户可以建立一个文件的基本权限:
用户在该目录要具有w和x的权限,
首先要能进去目录(x),
然后要能新建文件,就是修改目录中的内容(w)
5、
让用户能执行 cp /dir1/file1 /dir2 的基本权限:
用户首先要能读取源文件,并写入目标文件
dir1 用户至少要能进到dir1中(x)
file1 用户要能看到file1的内容(r)
dir2 用户要能往dir2里写入内容(w、x)
课后习题中的部分:
8.尝试用find找出目前Linux系统中所有具有SUID的文件有哪些?
find / -perm /4000 -print
9.找出/etc下面,文件大小介于50KB到60KB之间的文件,并且将权限完整地列出(ls-l)
find /etc -size +50k -a -size -60k -exec ls -l {} \;
注意到 -a
,那个 -a 是 and 的意思,为符合两者才算成功
10.找出/etc下面,文件容量大于50KB且文件所有者不是root的文件名,且将权限完整地列出(ls-l)
find /etc -size +50k -a ! -user root -exec ls -ld {} \;
11.找出/etc下面,容量大于1500KB以及容量等于0的文件
find /etc -size +1500k -o -size 0
那个 -o
就是或 (or) 的意思