zoukankan      html  css  js  c++  java
  • 4,linux入门到上手-文件与目录相关操作

    一、Linux文件种类与扩展名

    1,文件种类:

    任何设备在Linux下面都是文件,不仅如此,连数据沟通的接口也有专属的文件在负责~所以,你会了解到,Linux的文件种类真的很多,使用“ls -l”观察到第一栏那十个字符中,第一个字符为文件的类型。除了常见 的一般文件(-)与目录文件(d)之外,还有如下种类的文件。

    • 正规文件(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系统下面的捷径啦!第一个属性为[l](英文L的 小写),例如[lrwxrwxrwx];
    • 设备与设备文件(device):与系统周边及储存等相关的一些文件,通常都集中在/dev 这个目录之下!通常又分为两种:
      • 区块(block)设备文件:就是一些储存数据,以提供系统随机存取的周边设备,举例来说,硬盘与软盘等就是啦!你可以随机的在硬盘的不同区块读写,这种设备就 是区块设备啰!你可以自行查一下/dev/sda看看,会发现第一个属性为[b]喔!
      • 字符(character)设备文件:亦即是一些序列埠的周边设备,例如键盘、鼠标等 等!这些设备的特色就是“一次性读取”的,不能够截断输出。举例来说,你不可能 让鼠标“跳到”另一个画面,而是“连续性滑动”到另一个地方啊!第一个属性为[c]。
    • 数据接口文件(sockets): 既然被称为数据接口文件,想当然尔,这种类型的文件通 常被用在网络上的数据承接了。我们可以启动一个程序来监听用户端的要求,而用户端 就可以通过这个socket来进行数据的沟通了。第一个属性为[s],最常在/run或/tmp这些 个目录中看到这种文件类型了。
    • 数据输送档(FIFO, pipe):FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。FIFO是first-in-first-out的缩写。第一个属性为 [p]。

    2,Linux文件扩展名:

    • *.sh:脚本或批处理文件(scripts),因为批处理文件为使用shell写成的,所以扩展名就编成.sh啰;
    • Z, .tar, .tar.gz, .zip, *.tgz: 经过打包的压缩文件。这是因为压缩软件分别为gunzip, tar 等等的,由于不同的压缩软件,而取其相关的扩展名啰!
    • .html, .php:网页相关文件,分别代表HTML语法与PHP语法的网页文件啰!.html的 文件可使用网页浏览器来直接打开,至于.php的文件,则可以通过client端的浏览器来 server端浏览,以得到运算后的网页结果呢!

    3,Linux文件名长度限制:

    一般而言,单一文件或目录的最大容许文件名为255Bytes,以一个ASCII英文占用一个Bytes来 说,则大约可达255个字符长度。若是以每个中文字占用2Bytes来说,最大文件名就 是大约在128个中文字之内!

    4,Linux文件名称的限制:

    由于Linux在命令行下的一些指令操作关系,一般来说,你在设置Linux下面的文件名称时, 最好可以避免一些特殊字符比较好!例如下面这些:

    ?	>	<	;	&	!	[	]	|		'	"	`	(	)	{	}
    

    因为这些符号在命令行下,是有特殊意义的!另外,文件名称的开头为小数点“.”时,代表这 个文件为“隐藏文件”喔!同时,由于指令下达当中,常常会使用到 -option之类的选项,所以你最好也避免将文件文件名的开头以-或+来命名啊!

    二、目录相关操作的命令

    1,变换目录命令cd (全称change directory)

    //常用实例:
    [dmtsai@study	~]$	su	-		#	先切换身份成为	root	看看! 
    [root@study	~]#	cd	[相对路径或绝对路径] 
    #	最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰! 
    [root@study	~]#	cd	~dmtsai 
    #	代表去到	dmtsai	这个使用者的主文件夹,亦即	/home/dmtsai 
    [root@study	dmtsai]# cd	~ 
    #	表示回到自己的主文件夹,亦即是	/root	这个目录 
    [root@study	~]#	cd   
    #没有加上任何路径,也还是代表回到自己主文件夹的意思喔! 
    [root@study	~]#	cd	.. 
    #表示去到目前的上层目录,亦即是	/root	的上层目录的意思; 
    [root@study	/]#	cd	
    #	表示回到刚刚的那个目录,也就是	/root	啰~ 
    [root@study	~]#	cd	/var/spool/mail 
    #	这个就是绝对路径的写法!直接指定要去的完整路径名称! 
    [root@study	mail]#	cd	../postfix 
    #这个是相对路径的写法,我们由/var/spool/mail	去到/var/spool/postfix	就这样写!
    //特殊目录的使用介绍:
    .		       代表此层目录 
    ..			   代表上一层目录 
    -			   代表前一个工作目录 
    ~			   代表“目前使用者身份”所在的主文件夹 
    ~account	   代表	account	这个使用者的主文件夹(account是个帐号名称)
    

    2,pwd (显示目前所在的目录)(全称是Print Working Directory)

    [root@study	~]#	pwd	[-P] 
    选项与参数: 
    -P		:显示出确实的路径,而非使用链接(link)路径。
    范例:单纯显示出目前的工作目录: 
    [root@study	~]#	pwd 
    /root			&lt;==	显示出目录啦~
    

    3,mkdir (创建新目录)(全称make directory)

    [root@study	~]#	mkdir	[-mp]	目录名称 
    选项与参数: 
    -m	:设置文件的权限喔!直接设置,不需要看默认权限	(umask)	的脸色~ 
    -p	:帮助你直接将所需要的目录(包含上层目录)递回创建起来!
    范例:请到/tmp下面尝试创建数个新目录看看: 
    [root@study	~]#	cd	/tmp 
    [root@study	tmp]#  mkdir	test				&lt;==创建一名为test的新目录 [root@study tmp]#	mkdir	test1/test2/test3/test4 
    mkdir:cannot create	directory ‘test1/test2/test3/test4’:No such file or directory 
    #话说,系统告诉我们,没可能创建这个目录啊!就是没有目录才要创建的!见鬼嘛? 
    [root@study	tmp]#	mkdir	-p	test1/test2/test3/test4 
    #原来是要建test4上层没先建test3之故!加了这个-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	来强制设置属性,系统会使用默认属性。 
    #那么你的默认属性为何?这要通过上述介绍的[umask]来查看喔。
    

    4,rmdir (删除“空”的目录)

    [root@study	~]#	rmdir	[-p]	目录名称 
    选项与参数: 
    -p	:连同“上层”“空的”目录也一起删除
    
    范例:将于mkdir范例中创建的目录(/tmp下面)删除掉! 
    [root@study	tmp]#	ls	-ld	test*		&lt;==看看有多少目录存在? 
    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 
    [root@study	tmp]#	rmdir	test			&lt;==可直接删除掉,没问题 
    [root@study	tmp]#	rmdir	test1		&lt;==因为尚有内容,所以无法删除! 
    rmdir:	failed	to	remove	‘test1’:	Directory	not	empty 
    [root@study	tmp]#	rmdir	-p	 test1/test2/test3/test4 
    [root@study	tmp]#	ls	-ld	test*		&lt;==您看看,下面的输出中test与test1不见了! 
    drwx--x--x.	2	root			root		6	Jun		4	19:05	test2 
    #瞧!利用	-p	这个选项,立刻就可以将	test1/test2/test3/test4	一次删除~ 
    #	不过要注意的是,这个	rmdir	仅能“删除空的目录”喔!
    

    rmdir的使用条件,使用rmdir时目录需要一层一层的删除才行!而且被删除的目录里面必定不能存在其他的目录或文件!这也是所谓的空的目录(empty directory)的意思。如果要将所有目录下的东西都杀掉,就需要使用rm了,请看下面:

    5,rm(移除文件或目录)(全称remove)

    [root@study	~]#	rm	[-fir]	文件或目录 
    选项与参数: 
    -f		:就是	force	的意思,忽略不存在的文件,不会出现警告讯息;
    -i		:互动模式,在删除前会询问使用者是否动作 
    -r		:递回删除啊!最常用在目录的删除了!这是非常危险的选项!!!
    
    范例一:将	bashrc	删除掉! 
    [root@study	~]#	cd	/tmp 
    [root@study	tmp]#	rm	-i	bashrc 
    rm:	remove	regular	file	`bashrc'?	y 
    #	如果加上	-i	的选项就会主动询问喔,避免你删除到错误的文件名!
    
    范例二:通过万用字符*的帮忙,将/tmp下面开头为bashrc的文件名通通删除: 
    [root@study	tmp]#	rm	-i	bashrc* 
    #	注意那个星号,代表的是	0到无穷多个任意字符喔!很好用的东西!
    
    范例三:将所创建的/tmp/etc/这个目录删除掉! 
    [root@study	tmp]#	rmdir	/tmp/etc 
    rmdir:	failed	to	remove	'/tmp/etc':	Directory	not	empty  &lt;==	删不掉啊!因为这不是空的目录! 
    [root@study	tmp]#	rm	-r	/tmp/etc 
    rm:	descend	into	directory	`/tmp/etc'?	y 
    rm:	remove	regular	file	`/tmp/etc/fstab'?	y 
    rm:	remove	regular	empty	file	`/tmp/etc/crypttab'?	^C		&lt;==	按下	[crtl]+c	中断 .....(中间省略)..... #	因为身份是	root	,默认已经加入了	-i	的选项,所以你要一直按	y	才会删除! #	如果不想要继续按	y	,可以按下“	[ctrl]-c	”来结束	rm	的工作。 #	这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做: 
    [root@study	tmp]#	
    m	-r	/tmp/etc 
    #	在指令前加上反斜线,可以忽略掉	alias	的指定选项喔!至于	alias	我们在bash再谈!
    #	拜托!这个范例很可怕!你不要删错了!删除	/etc	系统是会挂掉的!
    
    范例四:删除一个带有	-	开头的文件 
    [root@study	tmp]#	touch	./-aaa-		&lt;==[touch](../Text/index.html#touch)这个指令可以创建空文件! 
    [root@study	tmp]#	ls	-l 
    -rw-r--r--.	1	root	root	0	Jun	11	19:22	-aaa-		&lt;==文件大小为0,所以是空文件
    [root@study	tmp]#	rm	-aaa-
    rm:	invalid	option	--	'a'			&lt;==	因为	"-"	是选项嘛!所以系统误判了! 
    Try	'rm	./-aaa-'	to	remove	the	file `-aaa-'.	&lt;==	新的	bash有给建议的 
    Try	'rm	--help'	for	more	information. 
    [root@study	tmp]#	rm	./-aaa-
    

    6,ls (文件与目录的检视)

    [root@study	~]#	ls	[-aAdfFhilnrRSt]	文件名或目录名称.. 
    [root@study	~]#	ls	[--color={never,auto,always}]	文件名或目录名称.. 
    [root@study	~]#	ls	[--full-time]	文件名或目录名称.. 
    选项与参数: 
    -a		:全部的文件,连同隐藏文件(	开头为	.	的文件)	一起列出来(常用) 
    -A		:全部的文件,连同隐藏文件,但不包括	.	与	..	这两个目录 
    -d		:仅列出目录本身,而不是列出目录内的文件数据(常用) 
    -f		:直接列出结果,而不进行排序	(ls	默认会以文件名排序!) 
    -F		:根据文件、目录等信息,给予附加数据结构,例如:						
    		 *:代表可可执行文件;/:代表目录;	=:代表socket文件;&#124;:代表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(复制文件或者目录)

    [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	等也复制了。 最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!
    

    8,mv(移动文件与目录,或更名)

    [root@study	~]#	mv	[-fiu]	source	destination 
    [root@study	~]#	mv	[options]	source1	source2	source3	....	directory 
    选项与参数: 
    -f		:force	强制的意思,如果目标文件已经存在,不会询问而直接覆盖; 
    -i		:若目标文件	(destination)	已经存在时,就会询问是否覆盖! 
    -u		:若目标文件已经存在,且	source	比较新,才会更新	(update)
    
    范例一:复制一文件,创建一目录,将文件移动到目录中 
    [root@study	~]#	cd	/tmp 
    [root@study	tmp]#	cp	~/.bashrc	bashrc 
    [root@study	tmp]#	mkdir	mvtest 
    [root@study	tmp]#	mv	bashrc	mvtest 
    #	将某个文件移动到某个目录去,就是这样做!
    
    范例二:将刚刚的目录名称更名为	mvtest2 
    [root@study	tmp]#	mv	mvtest	mvtest2	&lt;==	这样就更名了!简单~ #	其实在	Linux下面还有个有趣的指令,名称为	rename,该指令专职进行多个文件名的同时更名,并非针对单一文件名变更,与mv不同。请man	rename。
    
    范例三:再创建两个文件,再全部移动到	/tmp/mvtest2	当中 
    [root@study	tmp]#	cp	~/.bashrc	bashrc1 
    [root@study	tmp]#	cp	~/.bashrc	bashrc2 
    [root@study	tmp]#	mv	bashrc1	bashrc2	mvtest2 
    #	注意到这边,如果有多个来源文件或目录,则最后一个目标文件一定是“目录!” 
    #	意思是说,将所有的数据移动到该目录的意思!
    

    三、文件内容查阅相关命令

    • cat由第一行开始显示文件内容
    • tac从最后一行开始显示,可以看出tac是cat的倒着写!
    • nl显示的时候,顺道输出行号!
    • more一页一页的显示文件内容
    • less与more类似,但是比more更好的是,他可以往前翻页!
    • head只看头几行
    • tail只看尾巴几行
    • od以二进制的方式读取文件内容!

    1、直接查阅一个文件内容可以使用cat/tac/nl这几个指令

    • cat
    [root@study	~]#	cat	[-AbEnTv] 
    选项与参数: 
    -A		:相当于	-vET	的整合选项,可列出一些特殊字符而不是空白而已; 
    -b		:列出行号,仅针对非空白行做行号显示,空白行不标行号! 
    -E		:将结尾的断行字符	$	显示出来; 
    -n		:打印出行号,连同空白行也会有行号,与	-b	的选项不同; 
    -T		:将	[tab]	按键以	^I	显示出来; 
    -v		:列出一些看不出来的特殊字符
    
    范例一:检阅	/etc/issue	这个文件的内容 
    [root@study	~]#	cat	/etc/issue 
    S 
    Kernel	
    	on	an	m
    
    范例二:承上题,如果还要加印行号呢? 
    [root@study	~]#	cat	-n	/etc/issue					
    1		S					
    2		Kernel	
    	on	an	m					
    3 
    #	所以这个文件有三行!看到了吧!可以印出行号呢!这对于大文件要找某个特定的行时,有点用处! #	如果不想要编排空白行的行号,可以使用“cat	-b	/etc/issue”,自己测试看看:
    
    范例三:将	/etc/man_db.conf	的内容完整的显示出来(包含特殊字符) 
    [root@study	~]#	cat	-A	/etc/man_db.conf 
    #	$ 
    ....(中间省略).... 
    MANPATH_MAP^I/bin^I^I^I/usr/share/man$ 
    MANPATH_MAP^I/usr/bin^I^I/usr/share/man$ 
    MANPATH_MAP^I/sbin^I^I^I/usr/share/man$ 
    MANPATH_MAP^I/usr/sbin^I^I/usr/share/man$ 
    .....(下面省略)..... 
    
    • tac(反向显示)
    [root@study	~]#	tac	/etc/issue
    Kernel	
    	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		:行号字段的占用的字符数。
    

    2、可翻页检视(more/less)

    前面提到的nl与cat与tac等等,都是一次性的将数据一口气显示到屏幕上面,然而more与less让我们可以一页一页的观察,才不会前面的数据看不到。

    • more(一页一页翻动)
    空白键	(space):代表向下翻一页; 
    Enter	:代表向下翻“一行”; 
    /字串	:代表在这个显示的内容当中,向下搜寻“字串”这个关键字; 
    :f	:立刻显示出文件名以及目前显示的行数; 
    q	:代表立刻离开	more	,不再显示该文件内容。 
    b	或	[ctrl]-b	:代表往回翻页,不过这动作只对文件有用,对管线无用。
    
    • less(一页一页翻动)
    空白键	:向下翻动一页;
    [pagedown]:向下翻动一页; 
    [pageup]	:向上翻动一页; 
    /字串	:向下搜寻“字串”的功能; 
    ?字串	:向上搜寻“字串”的功能; 
    n	:重复前一个搜寻	(与	/	或	?	有关!) 
    N	:反向的重复前一个搜寻	(与	/	或	?	有关!) 
    g	:前进到这个数据的第一行去; 
    G	:前进到这个数据的最后一行去	(注意大小写); 
    q	:离开	less	这个程序;
    

    3、数据撷取

    • head(取出前面几行)
    [root@study	~]#	head	[-n	number]	文件 
    选项与参数: 
    -n		:后面接数字,代表显示几行的意思
    [root@study	~]#	head	/etc/man_db.conf 
    #	默认的情况中,显示前面十行!若要显示前	20	行,就得要这样: 
    [root@study	~]#	head	-n	20	/etc/man_db.conf
    
    范例:如果后面100行的数据都不打印,只打印/etc/man_db.conf的前面几行,该如何是好? 
    [root@study	~]#	head	-n	-100	/etc/man_db.conf
    
    • tail(取出后面几行)
    [root@study	~]#	tail	[-n	number]	文件 
    选项与参数: 
    -n		:后面接数字,代表显示几行的意思 
    -f		:表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测
    [root@study	~]#	tail	/etc/man_db.conf 
    #	默认的情况中,显示最后的十行!若要显示最后的	20	行,就得要这样: 
    [root@study	~]#	tail	-n	20	/etc/man_db.conf
    
    范例一:如果不知道/etc/man_db.conf有几行,却只想列出100行以后的数据时?
    [root@study	~]#	tail	-n	+100	/etc/man_db.conf
    
    范例二:持续侦测/var/log/messages的内容 
    [root@study	~]#	tail -f	/var/log/messages	
    
    &lt;==要等到输入[crtl]-c之后才会离开tail这个指令的侦测!
    

    4、非纯文本文件:od

    5、修改文件时间或创建新文件:touch

    我们在ls这个指令的介绍时,有稍微提到每个文件在linux下面都会记录许多的时间参数,其 实是有三个主要的变动时间,那么三个时间的意义是什么呢?

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

    这是个挺有趣的现象,举例来说,我们来看一看你自己的/etc/man_db.conf这个文件的时间吧

    [root@study	~]#	touch	[-acdmt]	文件 
    选项与参数: 
    -a		:仅修订	access	time; 
    -c		:仅修改文件的时间,若该文件不存在则不创建新文件; 
    -d		:后面可以接欲修订的日期而不用目前的日期,也可以使用	--date="日期或时间" 
    -m		:仅修改	mtime	; 
    -t		:后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]
    

    touch命令的作用总结为:

    • 创建一个空的文件;
    • 将某个文件日期修订为目前(mtime与atime)

    6、观察文件类型:file

    如果你想要知道某个文件的基本数据,例如是属于ASCII或者是data文件,或者是binary ,且其中有没有使用到动态函数库(share library)等等的信息,就可以利用file这个指令来检阅喔!举例来说:

    通过这个指令,我们可以简单的先判断这个文件的格式为何喔!包括未来你也可以用来判断 使用tar包裹时,该tarball文件是使用哪一种压缩功能哩!

    4、指令与文件的搜寻

    1、指令文件名的搜寻

    我们知道在终端机模式当中,连续输入两次[tab]按键就能够知道使用者有多少指令可以下达。那你知不知道这些指令的完整文件名放在哪里?举例来说,ls这个常用的指令放在哪里 呢?就通过which或type来找寻吧!

    • which(寻找“可执行文件”)
    [root@study	~]#	which	[-a]	command 
    选项或参数: 
    -a	:将所有由PATH目录中可以找到的指令均列出,而不止第一个被找到的指令名称
    
    范例一:搜寻	ifconfig	这个指令的完整文件名 
    
    [root@study	~]#	which	ifconfig 
    /sbin/ifconfig	
    
    范例二:用which去找出which的文件名为何? 
    [root@study	~]#	which	which 
    alias which='alias &#124; /usr/bin/which --tty-only	--read-alias --show-dot	--show-tild'					/bin/alias								
    					/usr/bin/which
    #竟然会有两个which,其中一个是alias这玩意儿呢!那是啥?
    #那就是所谓的“命令别名”,意思是输入which会等于后面接的那串指令啦! 
    
    范例三:请找出	history	这个指令的完整文件名 
    [root@study	~]#	which	history 
    /usr/bin/which:	no	history	in	(/usr/local/sbin:/usr/local/bin:/sbin:/bin: /usr/sbin:/usr/bin:/root/bin)
    
    [root@study	~]#	history	--help 
    -bash:	history:	--:	invalid	option history:	usage:	history	[-c]	[-d	offset]	[n]	or	history	-anrw	[filename]	or	history	-ps	arg	
    #瞎密?怎么可能没有history,我明明就能够用root执行history的啊!
    

    这个指令是根据“PATH”这个环境变量所规范的路径,去搜寻“可执行文件”的文件名~所以, 重点是找出“可执行文件”而已!且which后面接的是“完整文件名”喔!若加上-a选项,则可以列出所有的可以找到的同名可执行文件,而非仅显示第一个而已!
    最后一个范例最有趣,怎么history这个常用的指令竟然找不到啊!为什么呢?这是因为 history是“bash内置的指令”啦!但是which默认是找PATH内所规范的目录,所以当然一定 找不到的啊(有bash就有history!)!那怎办?没关系!我们可以通过type这个指令喔!

    2、文件文件名的搜寻(whereis/locate/find)

    • whereis(由一些特定的目录中寻找文件文件名)

    whereis主要是针对/bin/sbin下面的可执行文件,以及/usr/share/man下面的man page文 件,跟几个比较特定的目录来处理而已。所以速度当然快的多!不过,就有某些文件是你找不到的啦!想要知道whereis到底查了多少目录?可以使用whereis -l来确认一下即可!

    • locate/updatedb

    你会发现使用locate来寻找数据的时候 特别的快,这是因为locate寻找的数据是由“已创建的数据库 /var/lib/mlocate/”里面的数据所 搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速啰!

    但是:数据库的创建默认是在每天执行 一次(每个distribution都不同,CentOS7.x是每天更新数据库一次!),所以当你新创建 起来的文件,却还在数据库更新之前搜寻该文件,那么locate会告诉你“找不到!”呵呵!因 为必须要更新数据库呀!

    那能否手动更新数据库哪?当然可以啊!更新locate数据库的方法非常简单,直接输入“ updatedb”就可以了!updatedb指令会去读取/etc/updatedb.conf这个配置文件的设置,然 后再去硬盘里面进行搜寻文件名的动作,最后就更新整个数据库文件啰!因为updatedb会去搜寻硬盘,所以当你执行updatedb时,可能会等待数分钟的时间喔!

    updatedb:根据/etc/updatedb.conf的设置去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate内的数据库文件;

    locate:依据/var/lib/mlocate内的数据库记载,找出使用者输入的关键字文件名。

    • find

  • 相关阅读:
    Add Binary <leetcode>
    那些坑
    面试集锦
    随看随记
    View的事件处理流程
    android studio view.setId报错
    EditText的hint不显示
    EditText 焦点
    Android拍照的那些事
    微信支付提示签名错误
  • 原文地址:https://www.cnblogs.com/v01cano/p/11738759.html
Copyright © 2011-2022 走看看