【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 非空文件夹    按照提示删除就行了


m -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、
用户在某个目录内,读取一个文件的基本权限:
catmoreless 等
用户首先要能进入这个目录,对这个目录要有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) 的意思

原文地址:https://www.cnblogs.com/dindin1995/p/13059063.html