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

  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/v01cano/p/11738759.html
Copyright © 2011-2022 走看看