现在的位置: 首页 > 综合 > 正文

linux shell学习总结(1)…

2013年04月07日 ⁄ 综合 ⁄ 共 6909字 ⁄ 字号 评论关闭

1.

-rw-r--r-- :这是该文件的权限位。

第一个横杠:指定文件类型,表示该文件是一个普通文件。(所创建的文件绝大多数都是普通文件

或符号链接文件)

除去最前面的横杠,一共是9 个字符,他们分别对应9 个权限位。通过这些权限位,可以设定

用户对文件的访问权限。对这两个文件的精确解释是:

代码:

 

rw-:前三位,文件属主可读、写

r--:中间三位,组用户可读

r--:最后三位,其他用户只可读

 

在创建的时候并未给属主赋予执行权限,在用户创建文件时,系统不会自动地设置执行权限位。

这是出于加强系统安全的考虑

2.

文件的权限位中中每一组字符中含有三个权限位:

代码:

 

r 读权限

w /更改权限

x 执行该脚本或程序的权限

 

如:

代码:

 

r-- --- --- 文文件属主可读,但不能写或执行

r-- r-- --- 文文件属主和属组用户(一般来说,是文件属主所在的缺省组)可读

r-- r-- r- - 文任何用户都可读,但不能写或执行

rwx r-- r- - 文文件属主可读、写、执行,属组用户和其他用户只可读

rwx r-x --- 文文件属主可读、写、执行,属组用户可读、执

rwx r-x r- x 文文件属主可读、写、执行,属组用户和其他用户可读、执行

rw- rw- --- 文文件属主和属组用户可读、写

rw- rw- r- - 文文件属主和属组用户可读、写,其他用户可读

rw- rw- --- 文文件属主和属组用户及其他用户读可以读、写,慎用这种权限

设置,因为任何用户都可以写入该文件

3.使用ls –l  filename可以查看filename的属性

4.

使用 chmod 来改变权限位

这一命令有符号模式和绝对模式。

符号模式

chmod 命令的一般格式为:

chmod [who] operator
[permission] filename

w h o 的含义是:

代码:

u 文件属主权限。

g 属组用户权限。

o 其他用户权限。

a 所有用户(文件属主、属组用户及其他用户)

 

 

o p e r a t o r 的含义:

代码:

+ 增加权限。

- 取消权限。

= 设定权限。

p e r m i s s i o n 的含义:

代码:

r 读权限。

w 写权限。

x 执行权限。

s 文件属主和组set-ID

t 粘性位*

l 给文件加锁,使其他用户无法访问。

u,g,o 针对文件属主、属组用户及其他用户的操作。

*在列文件或目录时,有时会遇到“
t”位。“t”代表了粘性位。如果在一个目录上出现“t”位,

这就意味着该目录中的文件只有其属主才可以删除,即使某个属组用户具有和属主同等的权限。

不过有的系统在这一规则上并不十分严格。

如果在文件列表时看到“ t”,那么这就意味着该脚本或程序在执行时会被放在交换区(虚存)

5.

chown

当你创建一个文件时,你就是该文件的属主。一旦你拥有某个文件,就可以改变它的所有权,把

它的所有权交给另外一个/ e t c / p a s s w d 文件中存在的合法用户。可以使用用户名或用户

I D 号来完成这一操作。

在改变一个文件的所有权时,相应的s u i d 也将被清除,这是出于安全性的考虑。只有文件的

属主和系统管理员可以改变文件的所有权。一旦将文件的所有权交给另外一个用户,就无法再重

新收回它的所有权。如果真的需要这样做,那么就只有求助于系统管理员了

 

c h o w n 命令的一般形式为:

代码:

chown -R -h owner file

引用:

- R 选项意味着对所有子目录下的文件也都进行同样的操作。

- h 选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。

 

chown 举例

代码:

如:

# ls -l

drwxrwxr-x 2 sam sam 4096 10 26 19:48 sam

# chown gem sam

# ls -l

drwxrwxr-x 2 gem sam 4096 10 26 19:48 sam

文件 sam
的所有权现在由用户sam 交给了用户gem

6.

符号链接

存在两种不同类型的链接,软链接和硬链接。修改其中一个,硬连接指向的是节点(inode),而软

连接指向的是路径(path)

软链接文件

软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以

链接不同文件系统的文件。和win 下的快捷方式差不多。链接文件甚至可以链接不存在的文件,

这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己。类似于编

程语言中的递归。

命令格式:

代码:

ln [-s] source_path target_path

硬链接文件

info ln 命令告诉您,硬链接是已存在文件的另一个名字,硬连接的命令是

代码:

ln -d existfile newfile

引用:

硬链接文件有两个限制

1、不允许给目录创建硬链接;

2、只有在同一文件系统中的文件之间才能创建链接。

对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件

的源文件,硬链接文件仍然存在,而且保留了愿有的内容。这时,系统就“忘记”了它曾经是

硬链接文件。而把他当成一个普通文件。修改其中一个,与其连接的文件同时被修改

7.

索引节点、硬连接和连接计数

索引节点inode

引用:

Linux 为每个文件分配一个称为索引节点的号码inode,可以将inode
简单理解成一个指针,

它永远指向本文件的具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。

例如:

假设我们在硬盘当前目录下建立了一个名为mytext 文本文件,其内容只有一行:

代码:

This is my file.

代码:

1、当然这行文字一定是存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇

区号来描述,在本例中假设分别是12030)

2、假设其inode 262457,那么系统通过一段标准程序,就能将这个inode 转换成存放此

文件的具体物理地址(1 磁头、20 柱面、30 扇区),最终读出文件的内容:“This is my file.”

3、所以inode 是指向一个文件数据区的指针号码,一个inode 对应着系统中唯一的一片物理

数据区,而位于两个不同物理数据区的文件必定分别对应着两个不同的inode 号码。

文件拷贝命令与硬链接的区别:

代码:

# cp /home/zyd/mytext newfile

在当前工作目录建立了一个新文件newfile,其实际操作主要包括如下三步:

引用:

1、在当前目录中增加一个目录项,其文件名域填入newfile,并分配了一个新的inode,假设

262456

2、将原文件(1 磁头、20 柱面、30 扇区)的内容复制了一份到新的空闲物理块(假设是1

头、20 柱面、31 扇区)

3、填写一些其他关键信息,使系统通过这些信息及inode 号码可以完成物理地址的转换。

所以文件复制要分配新的inode 和新的数据区,虽然两个文件的内容是一样的。

硬连接hardlink

引用:

我们实际使用文件时一般是通过文件名来引用的。通过上面的讨论,我们知道:

1 inode 号码肯定和一片完全属于一个文件的数据区一一对应。那么一个文件系统中两个或

更多个不同的文件名能否对应同一个文件呢?答案是肯定的。

我们知道
inode
号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项

具有相同的inode 值,实际上就使它们对应着同一个文件。

有几个目录项具有相同的
inode
号,我们就说这个文件有几个硬连接(hardlink)

对于普通文件,ls -l 命令的连接计数count
域的数值就是本文件拥有的硬连接数。硬连接可以

通过ln 命令建立,

例如:

代码:

# ln /home/zyd/mytext
hardlink_mytext

就建立了一个新的文件hardlink_mytext,这个文件的inode 同样是262457。建立硬连接实

际上只是增加了一个目录项,但并未复制文件数据区,原文件的数据区由两个文件共享。这一方面

能够节约大量磁盘空间,同时可以保证两个文件能同步更新。

代码:

'ls -il'可以显示文件的inode(在下面最左边)

262456 -rw-rw-r-- 1 zyd zyd 17 Nov
3 14:52 newfile

262457 -rw-rw-r-- 2 zyd zyd 17 Nov
3 14:50 hardlink_mytext

262457 -rw-rw-r-- 2 zyd zyd 17 Nov
3 14:50 mytext

连接计数count

前面我们介绍了,文件的连接计数域表明本系统中共有几个文件目录项的inode 和本文件相同,

也就是本文件共有几个硬连接。如上面的例子中hardlink_mytext mytext
文件的count

值都是2

那么对于目录,其count 域的含义是什么呢?目录的count 同样表示共有多少个目录项指向此

目录,不过要详细说明必须进一步解释VFS 文件系统的结构,为简单起见,只要这样理解就行

了:(count-2)等于本目录包含的直接子目录数(就是只包括儿子,不包括孙子啦!)

代码:

例如:如果一个目录/abc count
域为5,那么/abc
目录一定包含3 个子目录。

引用:

进一步说明:

硬连接文件实际上并不是一种新的文件类型,两个文件互为对方的硬连接。它们应该都是普通

文件(谁能告诉我:其它类型的文件可以硬连接吗?)。两个文件除了名称或/和文件目录不同外,

其它部分完全相同,更改了一个文件,另一个的文件长度、内容、更改时间等都将相应发生变

化,更改了一个文件的权限位mode,另一个也会发生同样的变化。

引用:

注意连接计数字段
count,互为硬连接的两个文件的count 值都是2,表明有两个inode 指向

同一文件的inode

当我们删除其中一个文件时,系统首先将(count-1)->count,如果结果是零,就将其目录项和

数据区都删除,否则只将本目录项删除,数据区仍然保留,仍然可以通过另外的文件名访问。

根据这个特性,可以通过为重要的文件建立硬连接的方法来防止其被误删除。

一个文件系统允许的inode 节点数是有限的,如果文件数量太多,即使每个文件都是0 字节的

空文件,系统最终也会因为节点空间耗尽而不能再创建文件。所以当发现不能建立文件时首先要

考虑硬盘数据区是否还有空间(可通过du 命令),其次还得检查节点空间。

引用:

互为硬连接的多个文件必须位于同一个文件系统上。根设备及任何一个需要mount 才能挂接进

来的分区、软盘、NFS、光驱等都是一个独立的文件系统,每个文件系统有一个相应的设备号,

不同文件系统中具有相同inode 节点的文件间没有任何联系。系统则通过设备号和 inode

的组合唯一确定一个文件。

Linux 之所以能支持多种文件系统,其实是由于Linux 提供了一个虚拟文件系统VFSVFS

为实际文件系统的上层软件,掩盖了实际文件系统底层的具体结构差异,为系统访问位于不同文

件系统的文件提供了一个统一的接口。

实际上许多文件系统并不具备inode 结构,其目录结构也和以上的讨论不同,但通过VFS,系

统均为其提供了虚拟一致的inode 和目录项结构。

所以,'ls -il'命令实际显示的inode 应该是VFS
inode
,也就是说,inode 是存在于内存中的

数据结构,而不一定是实际的硬盘结构。

但为 Linux 量身定做的ext2 文件系统具备实际的inode 和连接型目录项结构,所以,对于ext2

文件系统,可以认为我们上面讨论的关于硬连接的概念是完全正确的

8.

find的使用。

由于 f i n d 具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解

一下。即使系统中含有网络文件系统( N F S )f i n
d
命令在该文件系统中同样有效,只你具

有相应的权限。

在运行一个非常消耗资源的f i n d 命令时,很多人都倾向于把它放在后台执行,因为遍历一个

大的文件系统可能会花费很长的时间(这里是指3 0 G 字节以上的文件系统)

F i n d 命令的一般形式为:

代码:

find pathname -options [-print
-exec -ok]

让我们来看看该命令的参数:

引用:

pathname: find 命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。

-printfind 命令将匹配的文件输出到标准输出。

-execfind 命令对匹配的文件执行该参数所给出的s h e l l 命令。相应命令的形式为'

command' {} /;,注意{ }/;之间的空格。

-ok: 和- e x e c 的作用相同,只不过以一种更为安全的模式来执行该参数所给出的s h e l l

命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

9.

使用 exec ok 来执行shell 命令

引用:

使用 find 时,只要把想要的操作写在一个文件里,就可以用exec 来配合find 查找,很方便的

(在有些操作系统中只允许- e x e c 选项执行诸如l s ls
-l
这样的命令)。大多数用户使用这

一选项是为了查找旧文件并删除它们。建议在真正执行r m 命令删除文件之前,最好先用l s

命令看一下,确认它们是所要删除的文件。

e x e c 选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个/,最后是

一个分号。

为了使用
e x
e c
选项,必须要同时使用p r i n t 选项。如果验证一下f i n d 命令,会发现该

命令只输出从当前路径起的相对路径及文件名。

例如:为了用ls -l 命令列出所匹配到的文件,可以把ls -l 命令放在f i n d 命令的- e x e c

选项中

代码:

# find . -type f -exec ls -l {} /;

-rw-r--r-- 1 root root 34928
2003-02-25 ./conf/httpd.conf

-rw-r--r-- 1 root root 12959
2003-02-25 ./conf/magic

-rw-r--r-- 1 root root 180
2003-02-25 ./conf.d/README

上面的例子中,f i n d 命令匹配到了当前目录下的所有普通文件,并在- e x e c 选项中使用ls

-l 命令将它们列出。

/ l o g s 目录中查找更改时间在5 日以前的文件并删除它们:

代码:

$ find logs -type f -mtime +5 -exec
rm {} /;

记住,在s h e l l 中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用

诸如m v r m 命令时,可以使用- e x e c 选项的安全模式。它将在对每个匹配到的文件进

行操作之前提示你。

在下面的例子中,
f i n
d
命令在当前目录中查找所有文件名以. L O G 结尾、更改时间在5

日以上的文件,并删除它们,只不过在删除之前先给出提示。

代码:

$ find . -name "*.conf"
-mtime +5 -ok rm {} /;

< rm ... ./conf/httpd.conf >
? n

y 键删除文件,按n 键不删除。

任何形式的命令都可以在- e x e c 选项中使用。

在下面的例子中我们使用g r e p 命令。f i n
d
命令首先匹配所有文件名为“ passwd*

的文件,例如passwdpasswd.oldpasswd.bak,然后执

grep 命令看看在这些文件中是否存在一个sam 用户。

代码:

# find /etc -name
"passwd*" -exec grep "sam" {} /;

sam:x:501:501::/usr/sam:/bin/bash

论坛里-exec 执行脚本的的例子

使用 find 命令查找某个时间段的11 点到12 点的shell

find 命令的例子

查找当前用户主目录下的所有文件,下面两种方法都可以使用:

代码:

$ find $HOME -print

$ find ~ -print

为了在当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文

件,可以用:

代码:

$ find . -type f -perm 644 -exec ls
-l {} /;

为了查找系统中所有文件长度为0 的普通文件,并列出它们的完整路径,可以用:

代码:

$ find / -type f -size 0 -exec ls
-l {} /;

查找/var/logs 目录中更改时间在7 日以前的普通文件,并在删除之前询问它们:

代码:

$ find /var/logs -type f -mtime +7
-ok rm {} /;

为了查找系统中所有属于root 组的文件,可以用:

代码:

$find . -group root -exec ls -l {}
/;

-rw-r--r-- 1 root root 595 10 31
01:09 ./fie1

下面的 find 命令将删除当目录中访问时间在7 日以来、含有数字后缀的admin.log 文件。该命

令只检查三位数字,所以相应文件的后缀不要超过999

先建几个admin.log*的文件,才能使用下面这个命令

代码:

$ find . -name
"admin.log[0-9][0-9][0-9]" -atime -7 -ok

rm {} /;

< rm ... ./admin.log001 > ? n

< rm ... ./admin.log002 > ? n

< rm ... ./admin.log042 > ? n

< rm ... ./admin.log942 > ? n

为了查找当前文件系统中的所有目录并排序,可以用:

代码:

$ find . -type d |sort

为了查找系统中所有的r m t 磁带设备,可以用:

代码:

$ find /dev/rmt -print

代码:

原书为:

为了查找当前文件系统中的所有目录并排序,可以用:

$ find . -type d -loacl -mount
|sort

已更正为:

$ find . -type d |sort

抱歉!评论已关闭.