Linux文件与目录管理

以下内容学习自鸟哥的 Linux 私房菜

  1. 绝对路径:“一定由根目录 / 写起”; 相对路径:“不由 / 写起,而是由相对当前目录写起”

  2. 特殊目录有: ., .., -, ~, ~account需要注意;

  3. 与目录相关的指令有:cd, mkdir, rmdir, pwd 等重要指令;

    • cd: 变换目录
    • pwd: 显示目前的目录
    • mkdir: 创建一个新的目录
    • rmdir: 删除一个空的目录,仅能删除空目录,要删除非空目录需使用 “ rm -r ” 指令;
    • cd (change directory, 变换目录)
  4. 示例:

    [root@study	~]#	mkdir [-mp] 目录名称
    选项与参数:
    -m	:设置文件的权限喔!直接设置,不需要看默认权限 (umask)	的脸色~
    -p	:帮助你直接将所需要的目录(包含上层目录)递回创建起来!
    
    范例:创建权限为rwx--x--x的目录
    [root@study	tmp]# mkdir -m 711 test2
    [root@study	tmp]# ls -ld test*
    drwxr-xr-x.	2	root		root		6	Jun		4	19:03	test
    drwxr-xr-x.	3	root		root	18	Jun		4	19:04	test1
    drwx--x--x.	2	root		root		6	Jun		4	19:05	test2
    #	仔细看上面的权限部分,如果没有加上	-m	来强制设置属性,系统会使用默认属性。
    
    范例:创建权限为rwx--x--x的目录
    [root@study	tmp]# mkdir	-m	711	test2
    [root@study	tmp]# ls -ld test*
    drwxr-xr-x.	2	root		root		6	Jun		4	19:03	test
    drwxr-xr-x.	3	root		root	18	Jun		4	19:04	test1
    drwx--x--x.	2	root		root		6	Jun		4	19:05	test2
    #	仔细看上面的权限部分,如果没有加上 -m 来强制设置属性,系统会使用默认属性。
    
  5. 使用者能使用的指令是依据 PATH 变量所规定的目录去搜寻的;

  6. ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要!

    [root@study	~]#	ls	[-aAdfFhilnrRSt]	文件名或目录名称..
    [root@study	~]#	ls	[--color={never,auto,always}]	文件名或目录名称..
    [root@study	~]#	ls	[--full-time]	文件名或目录名称..
    选项与参数:
    -a		:全部的文件,连同隐藏文件( 开头为 .	的文件)	一起列出来(常用)
    -A		:全部的文件,连同隐藏文件,但不包括	. 与 .. 这两个目录
    -d		:仅列出目录本身,而不是列出目录内的文件数据(常用)
    -f		:直接列出结果,而不进行排序 (ls 默认会以文件名排序!)
    -F		:根据文件、目录等信息,给予附加数据结构,例如:
    	(*:代表可可执行文件;  /:代表目录;  =:代表 socket 文件;  |:代表 FIFO 文件;)
    -h		:将文件大小以人类较易读的方式(例如	GB,	KB	等等)列出来;
    -i		:列出 inode 号码, inode 的意义下一章将会介绍;
    -l		:长数据串行出,包含文件的属性与权限等等数据;(常用)
    -n		:列出 UID	与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!)
    -r		:将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小;
    -R		:连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;
    -S		:以文件大小大小排序,而不是用文件名排序;
    -t		:依时间排序,而不是用文件名。
    --color=never		:不要依据文件特性给予颜色显示;
    --color=always	    :显示颜色
    --color=auto	    :让系统自行依据设置来判断是否给予颜色
    --full-time			:以完整时间模式 (包含年、月、日、时、分) 输出
    --time={atime,ctime}	:输出 access 时间或改变权限属性时间 (ctime),而非内容变更时间	(modification time)
    
  7. 文件的复制、删除、移动可以分别使用:cp, rm, mv等指令来操作;

    • cp (复制文件或目录)
    [root@study	~]#	cp	[-adfilprsu]	来源文件(source)	目标文件(destination)
    [root@study	~]#	cp	[options]	source1	source2	source3	....	directory
    选项与参数:
    -a		:相当于	-dr	--preserve=all	的意思,至于	dr	请参考下列说明;(常用)
    -d		:若来源文件为链接文件的属性(link	file),则复制链接文件属性而非文件本身;
    -f		:为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次;
    -i		:若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
    -l		:进行硬式链接(hard	link)的链接文件创建,而非复制文件本身;
    -p		:连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
    -r		:递回持续复制,用于目录的复制行为;(常用)
    -s		:复制成为符号链接文件	(symbolic	link),亦即“捷径”文件;
    -u		:destination	比	source	旧才更新	destination,或	destination	不存在的情况下才复制。
    --preserve=all	:除了	-p	的权限相关参数外,还加入	SELinux	的属性,	links,	xattr	等也复制了。
    最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!
    
    • rm (移除文件或目录)
    [root@study	~]# rm [-fir] 文件或目录
    选项与参数:
    -f		:就是 force 的意思,忽略不存在的文件,不会出现警告讯息;
    -i		:互动模式,在删除前会询问使用者是否动作
    -r		:递回删除啊!最常用在目录的删除了!这是非常危险的选项!!!
    
    • mv (移动文件与目录,或更名)
    [root@study	~]#	mv	[-fiu]	source	destination
    [root@study	~]#	mv	[options]	source1	source2	source3	....	directory
    选项与参数:
    -f		:force	强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
    -i		:若目标文件	(destination)	已经存在时,就会询问是否覆盖!
    -u		:若目标文件已经存在,且	source	比较新,才会更新	(update)
    
  8. 检查文件的内容(读档)可使用的指令包括有: cat, tac, nl, more, less, head, tail, od 等

  9. cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同;

    • cat 由第一行开始显示文件内容
    [root@study	~]#	cat	[-AbEnTv]
    选项与参数:
    -A		:相当于	-vET	的整合选项,可列出一些特殊字符而不是空白而已;
    -b		:列出行号,仅针对非空白行做行号显示,空白行不标行号!
    -E		:将结尾的断行字符	$	显示出来;
    -n		:打印出行号,连同空白行也会有行号,与	-b	的选项不同;
    -T		:将	[tab]	按键以	^I	显示出来;
    -v		:列出一些看不出来的特殊字符
    
    • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
    [root@study	~]#	tac	/etc/issue
    Kernel	\r	on	an	\m
    \S
    #	嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔!
    
    • nl 显示的时候, 顺道输出行号!
    [root@study	~]#	nl	[-bnw]	文件
    选项与参数:
    -b		:指定行号指定的方式,主要有两种:
    	-b	a	:表示不论是否为空行,也同样列出行号(类似	cat	-n);
    	-b	t	:如果有空行,空的那一行不要列出行号(默认值);
    -n		:列出行号表示的方法,主要有三种:
    	-n	ln	:行号在屏幕的最左方显示;
    	-n	rn	:行号在自己字段的最右方显示,且不加	0	;
    	-n	rz	:行号在自己字段的最右方显示,且加	0	;
    -w		:行号字段的占用的字符数。
    
    • more 一页一页的显示文件内容
      • 空白键 (space):代表向下翻一页;
      • Enter :代表向下翻“一行”;
      • /字串 :代表在这个显示的内容当中,向下搜寻“字串”这个关键字;
      • :f :立刻显示出文件名以及目前显示的行数;
      • q :代表立刻离开 more , 不再显示该文件内容。
      • b 或 [ctrl]-b : 代表往回翻页,不过这动作只对文件有用,对管线无用。
    [root@study	~]#	more /etc/man_db.conf
    #
    #
    #	This file is used by the man-db	package	to	configure the man and cat paths.
    #	It	is	also used to provide a manpath for those without one by	examining
    #	their PATH environment variable. For details see the manpath(5)	man	page.
    #
    .....(中间省略).....
    --More--(28%)		<==	重点在这一行喔!你的光标也会在这里等待你的指令
    
    • less 与 more 类似, 但是比 more 更好的是,他可以往前翻页!
      • 空白键 :向下翻动一页;
      • [pagedown] :向下翻动一页;
      • [pageup] :向上翻动一页;
      • /字串 :向下搜寻“字串”的功能;
      • ?字串 :向上搜寻“字串”的功能;
      • n :重复前一个搜寻 (与 / 或 ? 有关)
      • N :反向的重复前一个搜寻 (与 / 或 ? 有关)
      • g :前进到这个数据的第一行去;
      • G :前进到这个数据的最后一行去 (注意大小写);
      • q :离开 less 这个程序;
    • head 只看头几行
    [root@study	~]#	head [-n number] 文件
    选项与参数:
    -n		:后面接数字,代表显示几行的意思
    
    • tail 只看尾巴几行
    [root@study	~]#	tail [-n number] 文件
    选项与参数:
    -n		:后面接数字,代表显示几行的意思
    -f		:表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测
    
    • od 以二进制的方式读取文件内容!(由于可执行文件通常是 binary file, 使用上头提到的指令来读取他的内容时, 确实会产生类似乱码的数据)
    [root@study	~]#	od [-t TYPE] 文件
    选项或参数:
    -t		:后面可以接各种“类型	(TYPE)”的输出,例如:
    	a		:利用默认的字符来输出;
    	c		:使用 ASCII 字符来输出
    	d[size]	:利用十进制(decimal)来输出数据,每个整数占用 size Bytes;
    	f[size]	:利用浮点数值(floating)来输出数据,每个数占用 size Bytes;
    	o[size]	:利用八进位(octal)来输出数据,每个整数占用 size Bytes;
    	x[size]	:利用十六进制(hexadecimal)来输出数据,每个整数占用 size Bytes;
    
  10. touch 的目的在修改文件的时间参数,但亦可用来创建空文件;

    • modification time (mtime): 当该文件的“内容数据”变更时,就会更新这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!
    • status time (ctime): 当该文件的“状态(status)”改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。
    • access time(atime): 当“该文件的内容被取用”时,就会更新这个读取时间(access)。举例来说,我们使用 cat 去读取 /etc/man_db.conf, 就会更新该文件的 atime了。
  11. 一个文件记录的时间参数有三种,分别是 access time(atime), status time (ctime),modification time(mtime), ls 默认显示的是 mtime。

  12. 除了传统的rwx权限之外,在Ext2/Ext3/Ext4/xfs文件系统中,还可以使用 chattr 与 lsattr 设置及观察隐藏属性。常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。

    • chattr (设置文件隐藏属性)
    [root@study ~]# chattr [+-=][ASacdistu] 文件或目录名称
    选项与参数:
    +			:增加某一个特殊参数,其他原本存在参数则不动。
    -			:移除某一个特殊参数,其他原本存在参数则不动。
    =			:设置一定,且仅有后面接的参数
    A		:当设置了 A	这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime将不会被修改,可避免	I/O	较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
    S		:一般文件是非同步写入磁盘的(原理请参考[前一章sync](../Text/index.html#sync)的说明),如果加上	S这个属性时,当你进行任何文件的修改,该更动会“同步”写入磁盘中。
    a		:当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root才能设置这属性
    c		:这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
    d		:当 dump程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份
    i		:这个 i 可就很厉害了!他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!”
    对于系统安全性有相当大的助益!只有 root 能设置此属性
    s		:当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了喔!
    u		:与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来救援该文件喔!
    注意1:属性设置常见的是 a 与 i 的设置值,而且很多设置值必须要身为 root 才能设置
    注意2:xfs 文件系统仅支持 AadiS 而已
    范例:请尝试到/tmp下面创建文件,并加入 i 的参数,尝试删除看看。
    [root@study ~]#	cd /tmp
    [root@study tmp]#	touch	attrtest		<==创建一个空文件
    [root@study tmp]#	chattr	+i	attrtest	<==给予 i 的属性
    [root@study tmp]#	rm	attrtest			<==尝试删除看看
    rm:	remove regular empty file `attrtest'?	y
    rm:	cannot remove `attrtest': Operation	not	permitted
    #	看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除设置!
    
    • lsattr (显示文件隐藏属性)
    [root@study ~]# lsattr [-adR] 文件或目录
    选项与参数:
    -a	:将隐藏文件的属性也秀出来;
    -d	:如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
    -R	:连同子目录的数据也一并列出来!
    [root@study tmp]# chattr +aiS attrtest
    [root@study tmp]# lsattr attrtest
    --S-ia----------	attrtest
    
  13. 新建文件/目录时,新文件的默认权限使用 umask 来规范。默认目录完全权限为 drwxrwxrwx, 默认文件完全权限则为-rw-rw-rw-。

    • 若使用者创建为“文件”则默认“没有可执行( x )权限”,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下: -rw-rw-rw-
    • 若使用者创建为“目录”,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下: drwxrwxrwx
    [root@study ~]# umask
    0022			<==与一般权限有关的是后面三个数字!
    [root@study ~]# umask -S
    u=rwx,g=rx,o=rx
    
  14. 文件具有SUID的特殊权限时,代表当使用者执行此一binary程序时,在执行过程中使用者会暂时具有程序拥有者的权限

  15. 目录具有SGID的特殊权限时,代表使用者在这个目录下面新建的文件之群组都会与该目录的群组名称相同。

  16. 目录具有SBIT的特殊权限时,代表在该目录下使用者创建的文件只有自己与root能够删除!

  17. 观察文件的类型可以使用 file 指令来观察;

    [root@study ~]# file ~/.bashrc
    /root/.bashrc:	ASCII	text	 <==告诉我们是	ASCII	的纯文本文件啊!
    [root@study ~]# file /usr/bin/passwd
    /usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped
    #	可执行文件的数据可就多的不得了!包括这个文件的	suid 权限、相容于Intelx86-64等级的硬件平台
    #	使用的是 Linux核心2.6.32的动态函数库链接等等。
    [root@study ~]# file /var/lib/mlocate/mlocate.db
    /var/lib/mlocate/mlocate.db: data		<== 这是 data 文件!
    
  18. 搜寻指令的完整文件名可用 which 或 type,这两个指令都是通过 PATH 变量来搜寻文件名;

    • which(寻找“可执行文件”)
    [root@study ~]# which [-a]	command
    选项或参数:
    -a	:将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称
    范例一:搜寻 ifconfig 这个指令的完整文件名
    [root@study ~]# which ifconfig
    /sbin/ifconfig	
    范例二:用 which 去找出 which 的文件名为何?
    [root@study ~]# which which
    alias	which='alias |	/usr/bin/which	--tty-only	--read-alias	--show-dot	--show-tilde'
    /bin/alias
    /usr/bin/which
    #	竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥?
    #	那就是所谓的“命令别名”,意思是输入 which 会等于后面接的那串指令啦!
    
  19. 搜寻文件的完整文件名可以使用 whereis 找特定目录或 locate 到数据库去搜寻,而不实际搜寻文件系统;

    • whereis(由一些指定的目录中寻找文件文件名)
    [root@study ~]# whereis [-bmsu] 文件或目录名
    选项与参数:
    -l				:可以列出 whereis 会去查询的几个主要目录而已
    -b				:只找	binary	格式的文件
    -m				:只找在说明文档 manual	路径下的文件
    -s				:只找 source来源文件
    -u				:搜寻不在上述三个项目当中的其他特殊文件
    范例一:请找出 ifconfig 这个文件名
    [root@study ~]# whereis	ifconfig	
    ifconfig:	/sbin/ifconfig	/usr/share/man/man8/ifconfig.8.gz
    范例二:只找出跟	passwd	有关的“说明文档”文件名(man	page)
    [root@study ~]# whereis passwd		#	全部的文件名通通列出来!
    passwd: /usr/bin/passwd /etc/passwd	/usr/share/man/man1/passwd.1.gz	/usr/share/man/man5        /passwd.5.gz
    [root@study ~]# whereis -m	passwd		# 只有在 man 里面的文件名才抓出来!
    passwd: /usr/share/man/man1/passwd.1.gz	/usr/share/man/man5/passwd.5.gz
    
    • locate
    [root@study ~]# locate	[-ir] keyword
    选项与参数:
    -i		:忽略大小写的差异;
    -c		:不输出文件名,仅计算找到的文件数量
    -l		:仅输出几行的意思,例如输出五行则是	-l	5
    -S		:输出	locate	所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
    -r		:后面可接正则表达式的显示方式
    
  20. 利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的文件名。

    [root@study ~]# find [PATH] [option] [action]
    选项与参数:
    1\.	与时间有关的选项:共有	-atime,	-ctime与 -mtime ,以 -mtime 说明
    		-mtime	 n	:n 为数字,意义为在	n天之前的“一天之内”被更动过内容的文件;
    		-mtime	+n	:列出在n天之前(不含n天本身)被更动过内容的文件文件名;
    		-mtime	-n	:列出在n天之内(含n天本身)被更动过内容的文件文件名。
    		-newer	file	:file 为一个存在的文件,列出比file还要新的文件文件名
    范例一:将过去系统上面24小时内有更动过内容	(mtime)	的文件列出
    [root@study ~]# find / -mtime 0
    #	那个 0 是重点! 0代表目前的时间,所以,从现在开始到24小时前,
    #	有变动过内容的文件都会被列出来!那如果是三天前的24小时内?
    #	find / -mtime 3	有变动过的文件都被列出的意思!
    范例二:寻找	/etc 下面的文件,如果文件日期比 /etc/passwd 新就列出
    [root@study ~]# find /etc -newer /etc/passwd
    #	-newer	用在分辨两个文件之间的新旧关系是很有用的!
    
posted @ 2019-02-28 14:17  lllittletree  阅读(109)  评论(0编辑  收藏  举报