存档

‘Linux命令大全’ 分类的存档

linux screen 命令详解

2017年4月28日 评论已被关闭

http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

一、背景

系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

二、简介

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

  • 会话恢复
只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
  • 多窗口
在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。
  • 会话共享
Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。

GNU’s Screen 官方站点:http://www.gnu.org/software/screen/

三、语法

# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

参数说明

-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或–list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

四、常用screen参数

screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session

在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window
C-a p -> Previous,切换到前一个 window
C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> Time,显示当前时间,和系统的 load
C-a k -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上

五、使用 screen

5.1 安装screen

流行的Linux发行版(例如Red Hat Enterprise Linux)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。

[root@TS-DEV ~]# yum install screen
[root@TS-DEV ~]# rpm -qa|grep screen
screen-4.0.3-4.el5
[root@TS-DEV ~]#

5.2 创建一个新的窗口

安装完成后,直接敲命令screen就可以启动它。但是这样启动的screen会话没有名字,实践上推荐为每个screen会话取一个名字,方便分辨:

[root@TS-DEV ~]# screen -S david

screen启动后,会创建第一个窗口,也就是窗口No. 0,并在其中打开一个系统默认的shell,一般都会是bash。所以你敲入命令screen之后,会立刻又返回到命令提示符,仿佛什么也没有发生似的,其实你已经进入Screen的世界了。当然,也可以在screen命令之后加入你喜欢的参数,使之直接打开你指定的程序,例如:

[root@TS-DEV ~]# screen vi david.txt

screen创建一个执行vi david.txt的单窗口会话,退出vi 将退出该窗口/会话。

5.3 查看窗口和窗口名称

打开多个窗口后,可以使用快捷键C-a w列出当前所有窗口。如果使用文本终端,这个列表会列在屏幕左下角,如果使用X环境下的终端模拟器,这个列表会列在标题栏里。窗口列表的样子一般是这样:

0$ bash  1-$ bash  2*$ bash

这个例子中我开启了三个窗口,其中*号表示当前位于窗口2,-号表示上一次切换窗口时位于窗口1。

Screen默认会为窗口命名为编号和窗口中运行程序名的组合,上面的例子中窗口都是默认名字。练习了上面查看窗口的方法,你可能就希望各个窗口可以有不同的名字以方便区分了。可以使用快捷键C-a A来为当前窗口重命名,按下快捷键后,Screen会允许你为当前窗口输入新的名字,回车确认。

5.4 会话分离与恢复

你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/david.txt文件:

[root@TS-DEV ~]# screen vi /tmp/david.txt

之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d,Screen会给出detached提示:

暂时中断会话

半个小时之后回来了,找到该screen会话:

[root@TS-DEV ~]# screen -ls

重新连接会话:

[root@TS-DEV ~]# screen -r 12865

一切都在。

当然,如果你在另一台机器上没有分离一个Screen会话,就无从恢复会话了。

这时可以使用下面命令强制将这个会话从它所在的终端分离,转移到新的终端上来:

5.5 清除dead 会话

如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

5.6 关闭或杀死窗口

正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。

如果一个Screen会话中最后一个窗口被关闭了,那么整个Screen会话也就退出了,screen进程会被终止。

除了依次退出/杀死当前Screen会话中所有窗口这种方法之外,还可以使用快捷键C-a :,然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序。其实C-a :这个快捷键允许用户直接输入的命令有很多,包括分屏可以输入split等,这也是实现Screen功能的一个途径,不过个人认为还是快捷键比较方便些。

六、screen 高级应用 

6.1 会话共享

还有一种比较好玩的会话恢复,可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令:

[root@TS-DEV ~]# screen -x

这个命令会将你朋友的终端Attach到你的Screen会话上,并且你的终端不会被Detach。这样你就可以和朋友共享同一个会话了,如果你们当前又处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到这个会话的不同窗口中去,那还是可以分别进行不同的操作的。

6.2 会话锁定与解锁

Screen允许使用快捷键C-a s锁定会话。锁定以后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但你的输入都会被Screen中的进程接收到。快捷键C-a q可以解锁一个会话。

也可以使用C-a x锁定会话,不同的是这样锁定之后,会话会被Screen所属用户的密码保护,需要输入密码才能继续访问这个会话。

6.3 发送命令到screen会话

在Screen会话之外,可以通过screen命令操作一个Screen会话,这也为使用Screen作为脚本程序增加了便利。关于Screen在脚本中的应用超出了入门的范围,这里只看一个例子,体会一下在会话之外对Screen的操作:

[root@TS-DEV ~]# screen -S sandy -X screen ping www.baidu.com

这个命令在一个叫做sandy的screen会话中创建一个新窗口,并在其中运行ping命令。

6.4 屏幕分割

现在显示器那么大,将一个屏幕分割成不同区域显示不同的Screen窗口显然是个很酷的事情。可以使用快捷键C-a S将显示器水平分割,Screen 4.00.03版本以后,也支持垂直分屏,快捷键是C-a |。分屏以后,可以使用C-a <tab>在各个区块间切换,每一区块上都可以创建窗口并在其中运行进程。

可以用C-a X快捷键关闭当前焦点所在的屏幕区块,也可以用C-a Q关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭,还可以通过窗口切换找到它。

6.5 C/P模式和操作

screen的另一个很强大的功能就是可以在不同窗口之间进行复制粘贴了。使用快捷键C-a <Esc>或者C-a [可以进入copy/paste模式,这个模式下可以像在vi中一样移动光标,并可以使用空格键设置标记。其实在这个模式下有很多类似vi的操作,譬如使用/进行搜索,使用y快速标记一行,使用w快速标记一个单词等。关于C/P模式下的高级操作,其文档的这一部分有比较详细的说明。

一般情况下,可以移动光标到指定位置,按下空格设置一个开头标记,然后移动光标到结尾位置,按下空格设置第二个标记,同时会将两个标记之间的部分储存在copy/paste buffer中,并退出copy/paste模式。在正常模式下,可以使用快捷键C-a ]将储存在buffer中的内容粘贴到当前窗口。

6.6 更多screen功能

同大多数UNIX程序一样,GNU Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。

以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg…)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。

useradd

2017年2月13日 评论已被关闭

useradd 

http://sunwj.blog.51cto.com/5969096/1652978

【功能说明】:

create a new user or update default new user information   #新建用户或者更新用户信息

【语法格式】:

useradd [options] LOGIN

 

【选项参数】:

参数 说明
-c, –comment COMMENT 添加用户备注内容,对应/etc/passwd的第五列
-d, –home-dir HOME_DIR 制定用户家目录,而不使用默认值
-e, –expiredate EXPIRE_DATE 设置用户账号失效日期,格式为“YYYY-MM-DD”
-g, –gid GROUP 指定用户的初始用户组
-G, –groups GROUPS 指定用户的次要用户组
-m, –create-home 强制!要创建用户主文件夹(一般账号默认值)
-M, –no-create-home 强制!不要创建用户主文件夹(系统账号默认值)
-N, –no-user-group 不创建以用户名为名称的用户组
-r, –system 创建一个系统账号
-s, –shell SHELL 指定用户的shell,默认为/bin/bash
-u, –uid UID 指定用户的UID

【实践操作】:

1、创建用户useraa ,并添加说明内容

[root@Mode /]# useradd -c “boss” useraa

[root@Mode /]# tail -n 5 /etc/passwd

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

sun:x:500:500::/home/sun:/bin/bash

useraa:x:501:501:boss:/home/useraa:/bin/bash

2、创建用户userdd,并指定用户家目录为/dd/ 。 该目录无需事先创建

[root@Mode /]# useradd -d /dd/ userdd

[root@Mode /]# tail -n 3 /etc/passwd

userdd:x:504:504::/dd/:/bin/bash

useree:x:505:505::/home/useree:/bin/bash

userff:x:506:506::/home/userff:/bin/bash

3、创建用户useree,设置用户明天失效 。 下图中的16573为距离1970年1月1日,还有多少天账号失效

[root@Mode /]# date

Sun May 17 19:54:15 CST 2015

[root@Mode /]# useradd -e 2015-05-18 useree

[root@Mode /]# tail -n 2 /etc/shadow

userdd:!!:16572:0:99999:7:::

useree:!!:16572:0:99999:7::16573:

4、创建用户usergg,并指定初始用户组为groupa,次要用户组为groupb

[root@Mode /]# useradd  -g groupa -G groupb usergg

[root@Mode /]# id usergg

uid=507(usergg) gid=506(groupa) groups=506(groupa),507(groupb)

5、创建用户userhh,但不创建与其用户名相同的组 。 不过用户还是会归属于一个默认的组

[root@Mode /]# useradd -N userhh

[root@Mode /]# id userhh

uid=508(userhh) gid=100(users) groups=100(users)

6、创建系统账号userii。下面可看到该用户的uid 小于500,而且/home目录里面也没有该用户的主目录

[root@Mode /]# id userii

uid=498(userii) gid=498(userii) groups=498(userii)

[root@Mode /]# tail -n 2 /etc/passwd

userhh:x:508:100::/home/userhh:/bin/bash

userii:x:498:498::/home/userii:/bin/bash

[root@Mode /]# ls /home

sun  useraa  useree  userff  usergg  userhh

7、创建用户userjj,且不允许该账号登录系统(指定该用户的shell为/sbin/nologin)

[root@Mode /]# useradd -s /sbin/nologin userjj

[root@Mode /]# su – useraa

[useraa@Mode ~]$ exit

logout

[root@Mode /]# su – userjj

This account is currently not available.

[root@Mode /]#

[root@Mode /]# tail -n 2 /etc/passwd

userii:x:498:498::/home/userii:/bin/bash

userjj:x:509:509::/home/userjj:/sbin/nologin

8、创建用户userboss,指定UID为1000,初始用户组为 groupb ,次要用户组为 groupa ,添加用户说明,而且不创建与用户名同名的组

[root@Mode /]# useradd -u 1000 -g groupb -G groupa -N -c “this account is for boss” userboss

[root@Mode /]#

[root@Mode /]# id userboss

uid=1000(userboss) gid=507(groupb) groups=507(groupb),506(groupa)

[root@Mode /]#

[root@Mode /]# tail -n 1 /etc/passwd

userboss:x:1000:507:this account is for boss:/home/userboss:/bin/bash

分类: Linux命令大全 标签:

find 实例分析

2017年2月5日 评论已被关闭

find 实例分析

要在/usr/linux中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR”,最后打印出所有包含”SYSCALL_VECTOR”的文件名,有以下几种方法实现

find /usr/linux -name “*.h” | xargs -n50 grep SYSCALL_VECTOR

grep SYSCALL_VECTOR /usr/linux/*.h | cut -d’:’ -f1 | uniq > filename

find /usr/linux -name “*.h” -exec grep “SYSCALL_VECTOR” {} \; -print

我用find / -name filename| rm -rf,不成功,请问为什么不成功?

find / -name filename -exec rm -rf {} \;

find . -name filename |rm -rf试一下{} 表示你找出来的结果。

\; 则相当于“宪法”,没什么说头,就是这么规定的,在 -exec 后面需要一个表示该命令终结的的符号。可以在 man find 中找到答案。

要让rm识别find的结果,如下:

find / -name filename |xargs rm -rf

之所以find . -name filename |rm -rf不通过,是因为rm命令不接受从标准输入传过来的指令

查找含特定字符串的文件

例如查找当前目录下含有”the string you want find…”字符串的文件:

$find . -type f -exec grep “the string you want find…” {} ; -print

从根目录开始查tmpfile,一旦查到马上删除

find / -name “tmpfile” -exec rm {} \;

find 的perm问题

请问一下以下命令什么意思?关键是那个数字前的-,其他都还知道

find -name “.*” -perm -007

我知道

find -name “.*” -perm 755

这个是用来查找权限位为755的隐藏文件

噢,对了还有,我上边的命令都省略了find的pathname参数 find默认是查找当前工作目录的吗?

如果我用 -ok 替代 -exec, 那么还需要加上 {} \; 吗?

这个已经清楚,仍然需要,因为 -ok 只是 -exec 的提示模式,它只是多了一个确认操作的步骤,刚才没有读懂那几句E文的意思 呵呵 不好意思

-007是指查找所有用户都可读、写、执行的文件,要小心呀~~~

解释解释?

find -name “.*” -perm -007 和 find -name “.*” -perm 777 有区别吗?

-007是怎么来得呢?

不过有一个问题

我用 find . -perm -100 会列出当前目录 . , 这是为什么呢?

下面引用由explover在 2002/10/01 06:15am 发表的内容:

-007是指查找所有用户都可读、写、执行的文件,要小心呀~~~

-007是查找含其它用户(不同组,非属主)可读,写,执行的文件.并不一定要同组可读写,-是指最少权限为007.

下面引用由一颗小白菜在 2002/10/01 10:16am 发表的内容:

OK了, 呵呵

不过有一个问题

我用 find . -perm -100 会列出当前目录 . , 这是为什么呢?

这种方法不会准确的找出目录的. -100是指权限至少是属主可运行.

在unix系统下,你可以拥有对目录文件的执行权你才可以进入一个目录.这便是目录文件被列出的原因.

find . -perm -001 -print找到往往是目录文件.

我的意思当然不是使用这种方法来找目录,只不过不明白其中的 -100 意义了

那以此类推,是不是 -010是指权限至少是owner同组可执行的吗?也就是说其实这里的010和-是分开的,-表示一个至少的意思,而且010才是真正用来描述权限位的?

这样子就明白了 谢谢你噢

 

将find出来的东西拷到另一个地方?

find *.c -exec cp ‘{}’ /tmp ‘;’

如果有特殊文件,可以用cpio,也可以用这样的语法:

find dir -name filename -print | cpio -pdv newdir

 

找出磁盘中某个大小范围内的文件

比如要查找磁盘中大于3M的文件:

find . -size +3000k -exec ls -ld {} ;

 

如何用find查找某一天更改的文件?

可以使用这一行命令来实现:

A=`find ~ -print` | ls -l –full-time $A 2>/dev/null | grep “Jun 27″ | grep 1998

 

使用find 命令查找某个时间段的shell怎么写。比如11点到12点的。thanks

创建一个脚本judgetime,内容如下:

ls -l $*|awk ‘{split($8,hour,”:”);if((hour[1]>23 || hour[1] < 1)&&hour[1]<24)print}’

到要查找的目录下,运行

find ./ -name “*” -exec judgetime {} \;

注意时间格式为24小时制。

thank you ,如果我要精确到分钟呢

touch -t 04241112 starttemp #精确到12分钟

touch -t 04241220 endtemp #截止到12点20

find [dir] -newer starttemp -a ! -newer endtemp -exec ls -l {} \;

newer?

那昨天12:10文件如何呢?

每天执行的时候,用当天的日期和时间戳替换一下不就行了吗?

我不知道他是不是把所有的11:00~12:00的都找出来,是不是只执行一次还是每天都执行?

这种情况俺猜想是自己的东西放在哪忘了,只记得当时是深夜了。

有道理!

不愧是斑竹!

不光知道怎么解决问题,还知道在什么情况下出现这类问题,佩服佩服!

问题又出现了。创建这个文件的时候。本来应该是时间的一栏现在写上了2002,而不是12:00.

等到12:00过了吧!

 

删除指定日期的文件

find ./ -name 文件名 -exec rm -f {} \;

例:删除当前30天内没用过的文件,用如下命令:

find / -atime +30 -exec rm -f {} \;

我自己试着写了一小段SHELL,也用ll ,grep, rm 几个命令,用起来还差强人意。

对过滤出来的文件名列表中用了一个FOR语句,再执行rm 。现在我想把这段SHELL 扩展一下让它每天定时运行将 n 天前的文件删掉,有没有人能给我一些提示,谢谢!

还有个问题,对于前面那位朋友提到的”find / -atime +30 -exec rm -f {} \;

“方法,我很早就试过几次,不过好像都不太对,参数 -atime n 是查找n天前被访问过的文件,我不明白的是这里的时间参照点是什么,以及这个n天是怎么计算的。

问 题二、对于”ll |cut -f 1” 这个命令我是不是用错了,我只想取出 ll 中列出的文件名,但用cut -f 命令做不到 ,我只好换用 ll |cut -c 59- 这种方式得到我要的文件名,but it’s a pool idear !我也试过用awk ,好像也不对,看看大家可不可以给我一些小小的提醒,TKS SO MUCH

问题三、如何改变 I结点 的日期格式 我现在的系统显示的格式是:

-rw-r—– 1 msahz01 users 2253 2002年2月 2日 poheader.i

我想把这换成

-rw-rw-rw- 1 house users 2193 Apr 19 2001 hkdisp.p

如何才能做到这点?

awk 应该可以

ll | awk ‘{print $9}’

删除多少天之前的文件

find /yourpath -mtime +31 -exec rm {} \;

find /yourpath -mtime +366 -exec rm {} \;

 

find中, -ctime, -mtime及其-atime有何区别

 

请问 -ctime 和 -mtime 有什么关系 ?

如果父目录的 ctime 改变, 那它下面的文件的 ctime 就会自动都改了吗 ?

-ctime 和 -mtime ,-atime 这些信息是存在哪儿呢 ?

 

我用 -mtime -1 找到了新建或改的文件.

但怎样才能找到一天内 mv 来的文件呢( 它们的时间是原有的时间,早于一天 ) ?

 

用-newer选项啊。

你可以先touch一个你想要的时间的文件如下:

$ touch -t 08190800 test

$ ls -l test

-rw-r–r– 1 dba other 0 Aug 19 08:00 test

然后

$ find . -newer test -print

.

./.sh_history

$ ls -l .sh_history

-rw——- 1 dba other 154 Aug 20 17:39 .sh_history

 

用touch可以写出你想要的任何时间的文件,然后用-newer ,! -newer选项即可成功。

 

1.ctime含inode信息修改的时间.mtime只指文件内容建立或修改的时间.

2 不会.

3.这些信息应该是存在文件系统的超级块里.

 

我查了书 -ctime 是指 inode 的改变(或称文件的状态改变).

请问 inode 存了哪些信息 ?

做了些小测试,-mtime 改, -ctime 一定也改.

改文件名, -ctime 也会改.

谁能回答 i-node 存了哪些东西 ?

 

vi /usr/include/sys/inode.h

 

班主,我不能 access /usr/include/sys/inode.h .

摘书如下:

Directories contain directory entries. Each entry contains a file or subdirectory name and an index node reference number (i-node number). To increase speed and enhance use of disk space, the data in a file is stored at various locations in the computer’s memory. The i-node contains the addresses used to locate all the scattered blocks of data associated with a file. The i-node also records other information about the file including time of modification and access, access modes, number of links, file owner, and file type.

可我发现 -atime 改了, -ctime 还没改. why ?

( 我先 cat 一个 ASCII 文件,再用 -atime -1 有它用 -ctime -1 居然没有它.)

着岂不跟 inode 信息改变, ctime 就改矛盾吗?

 

我不同意你贴出来的那段文章,正如我提到的那样,atime,ctime,mtime是放到超级块里,在sco unix下是一种叫stat的结构.(stat_32),不同的系统文件系统可能不同.

sco 下inode的结构如下:

 

typedef struct inode

{

struct inode *i_forw; /* inode hash chain */

struct inode *i_back; /* ‘’ */

struct inode *av_forw; /* freelist chain */

struct inode *av_back; /* ‘’ */

int *i_fsptr; /* “typeless” pointer to fs dependent */

ino32_t i_number; /* i number, 1-to-1 with dev address */

ushort i_ftype; /* file type = IFDIR, IFREG, etc. */

short i_fstyp; /* File system type */

off_t i_size; /* size of file */

ushort i_uid; /* owner */

ushort i_gid; /* group of owner */

ushort i_flag;

ushort i_want; /* i_flag extension to avoid MP races */

ushort i_count; /* reference count */

short i_nlink; /* directory entries */

dev_t i_rdev; /* Raw device number */

#define i_namtype i_rdev /* i_ftype==IFNAM subtype */

dev_t i_dev; /* device where inode resides */

struct mount *i_mton;/* ptr to mount table entry that */

/* this directory is mounted on */

struct region *i_rp; /* ptr to shared region if any */

struct stdata *i_sp; /* ptr to associated stream */

struct iisem *isem; /* ptr to XENIX semaphores */

struct iisd *isd; /* ptr to XENIX shared data */

} i_un;

#define i_mnton i_un.i_mton /* i_ftype==IFDIR IMOUNT */

#define i_rptr i_un.i_rp /* i_ftype==IFREG || i_ftype==IFBLK */

#define i_sptr i_un.i_sp /* i_ftype==IFCHR || i_ftype==IFIFO */

#define i_sem i_un.isem /* i_ftype==IFNAM && i_namtype==IFSEM */

#define i_sd i_un.isd /* i_ftype==IFNAM && i_namtype==IFSHD */

 

struct fstypsw *i_fstypp; /* ptr to file system switch FSPTR */

long *i_filocks; /* pointer to filock (structure) list */

unsigned long i_mappages; /* number of pages currently cached */

unsigned long i_vcode; /* read-ahead block save (NFS) */

short i_wcnt; /* write open count or ITEXT count */

struct lockb i_cilock; /* tas to synchronize i_flag changes */

ushort i_rdlocks; /* count of non-exclusive lockers */

} inode_t;

 

所以,访问一个文件不能改变inode信息.

使用chown, chgrp, chmod命令可以很好的比较mtime和ctime

chown改变一个文件的属主,用ctime可以找到,用mtime便找不到.

试试看.

多谢斑竹! 我是在 Solaris 上面试的.我是对 -ctime 不明白.

试的结果如下:

修改文件,-mtime 改了, -ctime 也会改.

访问文件,-atime 改了, -ctime 没变.

chown, chgrp, chmod,mv, 都会使 -ctime 改变,但不影响 -atime 和 -mtime.

touch 可以改 -mtime and/or -atime,但 touch -a 只改访问时间时,-ctime也改了.

touch -m 改修改时间时,-ctime当然也改了.

好象还有别的很多东西可以令 -ctime 改变, 搞不清楚.

有什么方法可以显示 -mtime,atime,ctime 吗?

可以用 -ctime 来实现对目录的增量文件进行备份或 transfer 吗 ?

多谢!

 

没有什么工具显示,(可能是俺不知道)

把下面程序里的st_mtime换成st_ctime,或st_atime便可以得到你要的了.

#include

int

main (int argc, char **argv)

{

struct stat buf;

char date[80];

char fname[80];

printf(“Enter filename (with full path) to check mtime : “);

scanf(“%s”,fname);

stat(fname, &buf);

printf (“mtime (in sec) of %s = %ld\n”, fname, buf.st_mtime);

strcpy(date, ctime((time_t *)&(buf.st_mtime)));

printf (“mtime (in date) of %s = %s\n”, fname, date);

}

 

至于文件备份,有什么不可以的么?

 

mtime ls -l 最近修改文件内容的时间

atime ls -lu 最近访问文件的时间

ctime ls -li 最近文件有所改变的状态 ,如文件修改,属性\属主 改变 ,节点 ,链接变化等 ,应该是不拘泥只是时间前后的改变

 

俺看了ls的帮助,以为只是按ctime或atime排序,显示的时间还是mtime.

 

仔细比较了一下,ayhan说的是对的.谢谢ayhan.

 

多谢 ahyan 提示 ! 我在 Solaris 上试过如下:

mtime 用 ls -l 看到

atime 用 ls -lu 看到

ctime 用 ls -lc 看到. (ls -li 只有 inode number)

摘书如下:

-c Uses time of last modification of the i-node (file

created, mode changed, and so forth) for sorting (-t)

or printing (-l or -n).

-u Uses time of last access instead of last modification

for sorting (with the -t option) or printing (with the

-l option).

-i For each file, prints the i-node number in the first

column of the report.

分类: Linux命令大全 标签:

grep 搜索目录中的文件

2017年2月4日 评论已被关闭

grep 搜索目录中的文件

http://blog.csdn.net/tsxw24/article/details/7828357

1.在某目录下的所有文件中搜索确定的关键词
grep -Fnr class ./
以上命令的意思是:在当前目录下的所有文件中搜索“class”,并显示文件名、行号和匹配所在行内容

2.在某目录下的所有文件中,按使用正则搜索
grep -Pnr “\d{3}” ./

-P 是 Perl 正则表达式,经过测试,发现此模式支持的正则最完整,支持正则的完整度由大到小为: -P > -E > -G
建议正则搜索时就直接使用-P模式,以避免去记忆-E和-G模式不支持的正则列表
3.只搜索某一类文件
grep -Pnr “\d{3}” `find -name “*.txt”`

4.只搜索某几类文件,如下,只搜索txt和php文件

grep -Pnr “\d{3}” `find |grep -P “.(txt|php)$”`

5.排除含某关键词的子目录不搜索。如下,含“weiba”关键词的子目录不搜索

grep -Pnr “\d{3}” `ls |grep -Fv weiba`
-v排除匹配项
6.更强功能的子目录筛选
grep -Pnr “\d{3}” `ls |grep -Pv ‘^(weiba|huati)$’`

grep -Pnr “\d{3}” `ls |grep -P ‘^(weiba|huati)$’`

附:greg 使用帮助
用法: grep [选项]… PATTERN [FILE]…

在每个 FILE 或是标准输入中查找 PATTERN。
默认的 PATTERN 是一个基本正则表达式(缩写为 BRE)。
例如: grep -i ‘hello world’ menu.h main.c
正则表达式选择与解释:
-E, –extended-regexp PATTERN 是一个可扩展的正则表达式(缩写为 ERE)
-F, –fixed-strings PATTERN 是一组由断行符分隔的定长字符串。
-G, –basic-regexp PATTERN 是一个基本正则表达式(缩写为 BRE)
-P, –perl-regexp PATTERN 是一个 Perl 正则表达式
-e, –regexp=PATTERN 用 PATTERN 来进行匹配操作
-f, –file=FILE 从 FILE 中取得 PATTERN
-i, –ignore-case 忽略大小写
-w, –word-regexp 强制 PATTERN 仅完全匹配字词
-x, –line-regexp 强制 PATTERN 仅完全匹配一行
-z, –null-data 一个 0 字节的数据行,但不是空行
杂项:
-s, –no-messages 不显示错误信息
-v, –invert-match 选中不匹配的行
-V, –version 显示版本信息并退出
–help 显示此帮助并退出
–mmap 忽略向后兼容性
输出控制:
-m, –max-count=NUM NUM 次匹配后停止
-b, –byte-offset 输出行的同时打印字节偏移
-n, –line-number 输出行的同时打印行号
–line-buffered 每行输出清空
-H, –with-filename 为每一匹配项打印文件名
-h, –no-filename 输出时不显示文件名前缀
–label=LABEL 标准输入将LABEL 打印为文件名
-o, –only-matching 只显示一行中匹配PATTERN 的部分
-q, –quiet, –silent 不显示所有输出
–binary-files=TYPE 假定二进制文件的TYPE 类型;
TYPE 可以是`binary’, `text’, 或`without-match’
-a, –text 等同于 –binary-files=text
-I 等同于 –binary-files=without-match
-d, –directories=ACTION 操作目录的方式;
ACTION 可以是`read’, `recurse’,或`skip’
-D, –devices=ACTION 操作设备、先入先出队列、套接字的方式;
ACTION 可以是`read’或`skip’
-R, -r, –recursive 等同于 –directories=recurse
–include=FILE_PATTERN 只查找匹配FILE_PATTERN 的文件
–exclude=FILE_PATTERN 跳过匹配FILE_PATTERN 的文件和目录
–exclude-from=FILE 跳过所有除FILE 以外的文件
–exclude-dir=PATTERN 跳过所有匹配PATTERN 的目录。
-L, –files-without-match 只打印不匹配FILEs 的文件名
-l, –files-with-matches 只打印匹配FILES 的文件名
-c, –count 只打印每个FILE 中的匹配行数目
-T, –initial-tab 行首tabs 分隔(如有必要)
-Z, –null 在FILE 文件最后打印空字符
文件控制:
-B, –before-context=NUM 打印以文本起始的NUM 行
-A, –after-context=NUM 打印以文本结尾的NUM 行
-C, –context=NUM 打印输出文本NUM 行
-NUM 等同于 –context=NUM
–color[=WHEN],
–colour[=WHEN] 使用标志高亮匹配字串;
WHEN 可以是`always’, `never’或`auto’
-U, –binary 不要清除行尾的CR 字符(MSDOS 模式)
-u, –unix-byte-offsets 当CR 字符不存在,报告字节偏移(MSDOS 模式)
‘egrep’即‘grep -E’。‘fgrep’即‘grep -F’。
直接使用‘egrep’或是‘fgrep’均已不可行了。
不带 FILE 参数,或是 FILE 为 -,将读取标准输入。如果少于两个 FILE 参数
就要默认使用 -h 参数。如果选中任意一行,那退出状态为 0,否则为 1;
如果有错误产生,且未指定 -q 参数,那退出状态为 2。

分类: Linux命令大全 标签:

find命令详解

2017年2月3日 评论已被关闭

find命令详解

(一)Get Start

最简单的find用法莫过于如此:

$ find .

查找当前目录下的所有文件。

find命令的一般格式为:

find [-H] [-L] [-P] [path…] [expression]

 

其中,’-H’ ‘-L’ ‘-P’三个选项主要是用来处理符号连接,’-H’表示只跟随命令行中指定的符号连接,’-L’表示跟随所有的符号连接,’-P’是默认的选项,表示不跟随符号连接。

例如,在我的当前目录下有一个符号连接e1000,现在我想查找文件名中最后一个字母是数字的源文件,那么

$ find -H . -name “*[0-9].c” -print

./2234.c

像上面这样写只能查找出当前目录下符合要求的文件,却找不出e1000下的文件。因此可以这么写:

$ find -H e1000 . -name “*[0-9].c” -print

或者使用 ‘-L’选项

$ find -L . -name “*[0-9].c” -print

 

格式中的[path…]部分表示以此目录为根目录进行搜索。

 

格式中的[expression]是一个表达式。最基本的表达式分为三类:设置项(option)、测试项(test)、动作项(action),这三类又可以通过逻辑运算符(operator)组合在一起形成更大更复杂的表达式。设置项(如-depth,-maxdepth等)针对这次查找任务,而不是仅仅针对某一个文件,设置项总是返回true;测试项(test)则不同,它针对具体的一个文件进行匹配测试,如-name,-num,-user等,返回true或者false;动作项(action)则是对某一个文件进行某种动作(最常见的如-print),返回true或者false。

正是[expression]部分的丰富,才使得find如此强大。此部分较复杂,后面慢慢说明。

 

(二)文件名

根据文件名来查找一个文件是大家经常遇到的事情,第一节中的’-name’正是解决此问题的。

-name属于表达式中的测试项(test),它按照文件名模式来匹配文件,若匹配则返回true,否则返回false。最好用引号将文件名模式引起来,防止shell自己解析要匹配的字符串。(可以用单引号也可以用双引号,单引号和双引号在shell环境中的区别见后续部分)

例如,想要的当前目录及子目录中查找文件名以一个大写字母开头或者以小写a或b开头的文件,可以用:

$ find . -name “[A-Za-b]*” -print

./a_book_of_c.chm

./TMP1234

如果想在当前目录查找文件名不以大写字母开头,之后跟一个小写字母,再之后是两个数字,最后是.txt的文件,可以这么用:

$ find . -name “[^A-Z][a-z][0-9][0-9].txt” -print

./@y38.txt

注意:此处的模式匹配并不符合正则表达式。

 

-name对大小写字母敏感,如果想匹配时不考虑大小写可以使用-iname测试项。’i’可以加在许多选项前面,比如-ipath,-iregex,-iwholename等等,都是表示大小写不敏感。

 

(三)正则表达式

使用上面的-name测试项能解决许多问题,但是有些还是不太好办,比如:查找当前目录下名称全部为数字的c源代码文件,这时就该’-regex’出手了。正则表达式绝对值得你去好好研究一下,在unix系统下太有用了,这里不做过多说明,请读者自行学习。

-regex同样属于测试项。使用-regex时有一点要注意:-regex不是匹配文件名,而是匹配完整的文件名(包括路径)。例如,当前目录下有一个文件”abar9″,如果你用”ab.*9″来匹配,将查找不到任何结果,正确的方法是使用”.*ab.*9″或者”.*/ab.*9″来匹配。

针对上面的那个查找c代码的问题,可以这么写:

$ find . -regex “.*/[0-9]*/.c” -print

./2234.c

 

还有一个设置项(option)’-regextype’,可以让你根据自己的喜好选择使用的正则表达式类型,大家可以试试。

 

(四)wholename与path

既然上一节提到了完整文件名(包括路径名),那么这里不妨说一下-wholename和-path。

-wholename和-path都属于测试项(test),而且功能也一样。-path从字面上看给人一种错觉,好像只匹配路径名(或者目录名),其实它也可以匹配文件名,因此-wholename这个名字更贴切一些。

看看这个例子,当前目录下有一个phone目录,phone目录里有一个文件名称是puk.txt,使用-path:

$ find . -path ‘*phone/pu*’

./phone/puk.txt

 

另外要提一点:使用-path的一般格式是:find [path …] -path pattern …

它的意思是:在[path …]部分指明的路径上,使用pattern匹配所有文件的完整文件名;而不是说在类似的pattern目录下查找文件。

 

(五)逻辑运算符

有了上面三个选项,你现在应该对文件名的相关匹配得心应手了,对于不是很复杂的查找应该也胜任了。但是看看这个例子,解释一下它在做什么?

$ find . -size +0c -wholename “*e*[0-9]*” -o ! /( -name “.” -o -name “*phone” /) -prune  -name “*.c” -user xixi -o -name “*phone”

下面是当前目录下的所有文件:

$ ls -l

total 224

-rw-r–r– 1 xixi  admin      0 2007-11-01 17:34 0dfe.c

-rw-r–r– 1 abc admin      0 2007-10-30 15:56 0s8a.txt

-rw-r–r– 1 abc admin      0 2007-11-04 01:00 0TMP123

-rw-r–r– 1 abc admin     73 2007-11-05 15:33 2234.c

-rw-r–r– 1 abc admin     72 2007-11-05 15:34 3e10.c

-rw——- 1 abc admin 224017 2006-03-16 12:16 a_book_of_c.chm

lrwxrwxrwx 1 abc admin     15 2007-11-04 11:48 e1000 -> ../e1000-7.6.9/

-rw-r–r– 1 abc admin     70 2007-11-05 14:57 e100.dat

lrwxrwxrwx 1 abc admin     13 2007-11-05 14:59 e100puk.txt -> phone/puk.txt

-rw-r–r– 1 abc admin      0 2007-11-06 22:21 e680phone

drwxr-xr-x 2 abc admin     37 2007-11-06 22:24 phone

drwxr-xr-x 2 abc admin     20 2007-11-07 01:07 phone1

drwxr-xr-x 2 abc admin      6 2007-11-05 15:37 phone2

-rw-r–r– 1 abc admin     67 2007-11-04 12:23 @y38.txt

 

phone$ ls -l

total 4

-rw-r–r– 1 abc admin  0 2007-11-06 22:24 e680gphone

-rw——- 1 abc admin 38 2007-11-05 14:58 puk.txt

 

phone1$ ls -l

total 0

-rw-r–r– 1 xixi admin 0 2007-11-07 01:07 hello.c

 

phone2$ ls -l

total 0

 

要想解决上面的问题就得学习一下find中的逻辑运算符。逻辑运算符主要有以下几个,按照优先级从高到低的顺序如下:

( expr )

括号优先级最高,首先对括号内的求值

! expr

对expr表达式的值取反

-not expr

同上,但是POSIX不支持

expr1 expr2

不加任何运算符,相当于两个之间加and,即与运算,两个表达式值都为true整个才返回true。先对expr1表达式求值,若为false,则不对expr2求值。

expr1 -a expr2

同上

expr1 -and expr2

同上,但是POSIX不支持

expr1 -o expr2

表示对expr1和expr2两个表达式的值求或,左右两个值只要有一个为ture,整个表达式就是true。先对expr1表达式求值,若为ture,则不对expr2求值。

expr1 -or expr2

同上,但是POSIX不支持

expr1 , expr2

逗号表达式。expr1和expr2都会求值,但是只返回expr2的值,expr1的值会被丢弃

 

正是因为有一个求值的顺序,所以你才有可能见到这样的写法:

$ find . -name “*.txt” -o -print

表示,如果表达式-name “*.txt”为真,就不再执行另一个表达式-print,即查找所有不是以.txt结尾的文件。

 

再有,要查找当前目录下,文件名中包括字母’e’,在’e’之后又有数字的不是目录文件的所有文件,可以这么写:

$ find . -name “*e*[0-9]*” ! -type d -print

./e1000

./e100.dat

./e100puk.txt

./3e10.c

大家可以自己多举几个例子试一下。

 

(六)-prune

-prune是一个动作项,它表示当文件是一个目录文件时,不进入此目录进行搜索。

要理解-prune动作,首先得理解find命令的搜索规则(也可以说find命令的算法)。

find命令递归遍历所指定的目录树,针对每个文件依次执行find命令中的表达式,表达式首先根据逻辑运算符进行结合,然后依次从左至右对表达式求值。以下面代码为例,进行说明

find PATHP1 OPT1 TEST1 ACT1 ( TEST2 or TEST3 ) ACT2

 

(1) 根据OPT1设置项进行find命令的整体设置,若没有-depth设置项,依次进行下面的步骤

(2) 令文件变量File = PATHP1

(3) 对File文件进行TEST1测试,若执行结果为false,转(8)

(4) 对File文件进行ACT1动作,若执行结果为false,转(8)

(5) 对File文件进行TEST2测试,若执行结果为true,转(7)

(6) 对File文件进行TEST3测试,若执行结果为false,转(8)

(7) 对File文件进行ACT2动作

(8) 若File文件是一个目录,并且没有被执行过-prune动作,则进入此目录

(9) 当前目录下是否还有文件,若有依次取一个文件,令File指向此文件,转(3);

(10) 判断当前目录是否是PATHP1,若是则程序退出;若不是,则返回上一层目录,转(9)

 

理解了上面的流程,那么不难理解下面的代码为什么只输出一个’.’

$ find . -prune

.

再有,当前目录下大于4090字节的文件有两个,而大于4096字节的文件只有一个,如下:

$ find . -size +4090c -print

.

./a_book_of_c.chm

 

$ find . -size +4096c -print

./a_book_of_c.chm

 

那么,将上面两个-print都替换为-prune,这两条命令分别输出什么?

$ find . -size +4090c -prune

.

$ find . -size +4096c -prune

./a_book_of_c.chm

这就是答案,如果你答对了,恭喜你,你已经掌握了find命令!

 

-prune经常和-path或-wholename一起使用,以避开某个目录,常见的形式是:

$ find PATH (-path <don’t want this path #1> -o -path <don’t want this path #2>) -prune -o -path <global expression for what I do want>

 

注意:如果同时使用-depth设置项,那么-prune将被find命令忽略。man手册页中这么说:”If -depth is given, false; no effect.”

说到这里,又得说说-depth设置项。网上好多资料说-depth设置项的功能是“在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找”,这明显是错误的,man手册页中如是说:”-depth Process each directory’s  contents before the directory itself.”。这有点像树的后序遍历,先遍历当前节点的所有子节点,然后再访问当前节点…

考考你:

下面的命令输出什么?为什么?

$ find . -depth -prune -name “*.c” -print

 

(七)时间戳

理解了上面几节,你已经掌握了find命令的“道” ^_^ ,下面这几节只是介绍一些常用、好用的“招式”。这一节介绍时间戳。

 

文件有三个时间属性:创建时间、最近修改时间、最近访问时间。

最近修改时间又包括两种,一是文件的状态(也即权限如rwx等)最近被修改时间,一是文件的数据(也即内容)最近被修改时间。touch命令改变的即是文件数据最近被修改时间。

最近访问时间,指的是最近一次文件数据(内容)被访问的时间。因此,使用ls命令输出文件的相关信息并不会修改文件的最近访问时间。

 

find命令提供了针对文件的最近访问时间、文件状态最近被修改时间、文件数据最近被修改时间进行匹配的测试项,分别是-amin, -cmin, -mmin和-atime, -ctime, -mtime两组,第一组基于分钟,第二组基于天。

以-amin为例,假设当前时间tnow=”2007-11-12 14:42:10″、t1=”2007-11-12 14:39:10″、t2=”2007-11-12 14:40:10″,那么要查找最近访问时间属于[t1,t2]时间段的文件,可以这么写:

$ find . -amin 3

若测试项参数是数字,则基本上都可以在数字参数前加”+”或者”-“号,表示“大于”或“小于”的意思,因此,要查找最近访问时间属于[t1,tnow]时间段的文件,可以这么写:

$ find . -amin -3

“-amin n”和”-atime n”的处理方法都是:根据当前时间和文件的相应时间属性求n值,然后比较n值和参数n,看是否符合要求。但是这个求n值的过程却有很大不同,他们的不同也代表了两组(基于分钟和基于天)的不同:

“-amin n”

1、求Δt,用当前时间减去文件对应属性的时间值即得到Δt,Δt = tnow – tfile;

2、求浮点数f,用Δt除以1分钟,f = Δt / 1min;

3、将f的小数部分入到整数部分,得到n。即,不管f是6.0102还是6.8901,n都等于7

“-atime n”

1、求Δt,用当前时间减去文件对应属性的时间值即得到Δt,Δt = tnow – tfile;

2、求浮点数f,用Δt处以24小时,f = Δt / 24hours;

3、将f的小数部分都舍掉,得到n。即,不管f是6.0102还是6.8901,n都等于6

大家可以多做实验,试一下。

 

(八)权限位

很多人都在用windows,从windows系统拷过来的文件经常被加上了可执行权限,比如我现在想把主目录下所有的后缀名为.txt .pdf .rm并且具有可执行权限位的文件查找出来,该怎么写呢?

这里就不得不说一说权限位测试项:-perm。-perm支持符号权限位表示法也支持绝对(八进制)权限位表示法,但是最好使用八进制的权限表示法(这只是个建议  ^_^ )。

-perm基本上有下面这几中形式:

-perm mode       File’s  permission  bits  are  exactly mode.

-perm -mode     All  of the permission bits mode are set for the file.

-perm /mode     Any of the permission bits mode are set for the file.

-perm +mode (此形式已经不推荐使用,功能与/mode相同)

好好理解上面蓝色部分,理解了,-perm测试项也就掌握了。

考考你:

看看下面这句话是什么意思?

find . -perm -444 -perm /222 ! -perm /111

 

现在再来解决本节最开始提出的问题:查找主目录下所有的后缀名为.txt .pdf .rm并且具有可执行权限位的文件。

$ find ~ /( -name “*.txt” -o -name “*.pdf” -o -name “*.rm” /)  /

-not /( -type d -o -type l /)  /

-perm /111 -print

 

(九)文件类型

有一个问题:我只想查找符号连接文件,可是查找结果中却包括了普通文件、目录文件等等,不相关的东西太多了,怎么把不是符号连接文件的查找结果去掉?

-type测试项刚好可以满足你的要求,-type c即可,其中c表示文件类型,find中支持如下类型:

b      block (buffered) special

c      character (unbuffered) special

d      directory

p      named pipe (FIFO)

f       regular file

l       symbolic link;

s      socket

D     door (Solaris)

针对上面的问题,可以这么写:

$ find . -name “e100*” -type l -print

./e1000

./e100puk.txt

但是,不要这么写:

$ find -L . -name “e100*” -type l -print

加上’-L’选项之后,你将查不到需要的东西,除非符号连接已经失效了。

 

(十)文件大小

前面一再使用-size测试项,这里简单介绍一下。

-size测试项根据文件的大小查找文件,文件大小既可以用块(block)来计量,也可以用字节来计量。默认情况下以块计量文件大小,若想使用字节来计量只需要在数字参数后加c即可。find支持的其他计量方式有:

-size n[cwbkMG],分别表示

‘b’    for 512-byte blocks (this is the default if no suffix  is used)

‘c’    for bytes

‘w’    for two-byte words

‘k’    for Kilobytes (units of 1024 bytes)

‘M’    for Megabytes (units of 1048576 bytes)

‘G’    for Gigabytes (units of 1073741824 bytes)

 

 

(十一)用户、用户组

根据用户、用户组来查找文件,这个没有太多要说的,记住命令格式即可:

-uid n

-user username or uid

-nouser

-gid n

-group gname or gid

-nogroup

 

(十二)输出格式

如果你不想查找到你想要的文件事单调的输出文件名,你可以使用-printf动作项输出你想要的格式,下面举几个-printf动作的参数:

%p    输出文件名,包括路径名

%f     输出文件名,不包括路径名

%m    以8进制方式输出文件的权限

%g    输出文件所属的组

%h    输出文件所在的目录名

%u    输出文件的属主名

例如:

$ find . -user xixi -printf “%m %p //n”

644 ./phone1/hello.c

644 ./0dfe.c

 

 

其余的,看man手册页吧。

 

(十三)执行外部命令

这又是一个很容易出彩的地方。find真是强大,对查找到的文件竟然可以调用外部命令进行处理。-exec动作项就是来完成这个功能的,格式是:

find . EXPR1 -exec command {} /;

注意:后一个花括号’}’和’/’之间有一个空格。

例如,查找当前目录下的所有普通文件,并用ls命令输出:

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

有些操作系统中出于安全考虑只允许-exec选项执行诸如l s或ls -l这样的命令。

也可以使用-exec动作项的安全模式:-ok动作项。它的功能和语法都跟-exec一样,只不过它以更安全的模式运行,当要删除文件时,它会给出提示,让你选择到底删除还是不删。

例如:

$ find logs -name “*abc*” -ok rm {} /;

 

使用-exec动作项处理匹配到的文件时,find命令会将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

xargs的使用格式是:

find PATH EXPR1 EXPR2 | xargs command

利用管道,把find命令匹配到的文件名传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec动作项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

例如,要在普通文件中查找文件内容中包含”io”的文件,可以这么写:

$ find . -type f | xargs grep “io”

Binary file ./a_book_of_c.chm matches

./2234.c:#include <stdio.h>

./3e10.c:#include <stdio.h>

 

find命令配合exec和xargs可以对所匹配到的文件执行几乎所有的命令。

(十四)总结

理解并运用find,关键是掌握find命令的处理规则(见第五节):递归遍历所指定的目录树,针对每个文件依次执行find命令中的表达式,表达式首先根据逻辑运算符进行结合,然后依次从左至右对表达式求值。把这个理解了,需要什么功能查一下man就可以了。

 

find命令还有好多功能这里没有涉及到,具体的大家看man手册页吧。在任何时候,man都是一个极好的帮助工具。   ^_^

(十五)附

第五节提出的问题,答案如下:

$ find . -size +0c -wholename “*e*[0-9]*” -o   /

!  /( -name “.” -o -name “*phone” /) -prune  -name “*.c” -user xixi   /

-o -name “*phone”

./e1000

./e100.dat

./phone

./phone/e680gphone

./e100puk.txt

./3e10.c

./phone1

./phone1/hello.c

./phone2

./0dfe.c

./e680phone

这篇文章断断续续写了好久,今天终于基本完工。参考了man手册页以及一些网上的资料。

要把自己心中所想有条理的写出来感觉真是不易,希望对大家有所帮助。

欢迎批评指正。

 

分类: Linux命令大全 标签:

find 实例

2017年1月20日 评论已被关闭

find 实例

 

要在/usr/linux中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR”,最后打印出所有包含”SYSCALL_VECTOR”的文件名,有以下几种方法实现

find /usr/linux -name “*.h” | xargs -n50 grep SYSCALL_VECTOR

grep SYSCALL_VECTOR /usr/linux/*.h | cut -d’:’ -f1 | uniq > filename

find /usr/linux -name “*.h” -exec grep “SYSCALL_VECTOR” {} \; -print

我用find / -name filename| rm -rf,不成功,请问为什么不成功?

find / -name filename -exec rm -rf {} \;

find . -name filename |rm -rf试一下{} 表示你找出来的结果。

\; 则相当于“宪法”,没什么说头,就是这么规定的,在 -exec 后面需要一个表示该命令终结的的符号。可以在 man find 中找到答案。

要让rm识别find的结果,如下:

find / -name filename |xargs rm -rf

之所以find . -name filename |rm -rf不通过,是因为rm命令不接受从标准输入传过来的指令

查找含特定字符串的文件

例如查找当前目录下含有”the string you want find…”字符串的文件:

$find . -type f -exec grep “the string you want find…” {} ; -print

从根目录开始查tmpfile,一旦查到马上删除

find / -name “tmpfile” -exec rm {} \;

find 的perm问题

请问一下以下命令什么意思?关键是那个数字前的-,其他都还知道

find -name “.*” -perm -007

我知道

find -name “.*” -perm 755

这个是用来查找权限位为755的隐藏文件

噢,对了还有,我上边的命令都省略了find的pathname参数 find默认是查找当前工作目录的吗?

如果我用 -ok 替代 -exec, 那么还需要加上 {} \; 吗?

这个已经清楚,仍然需要,因为 -ok 只是 -exec 的提示模式,它只是多了一个确认操作的步骤,刚才没有读懂那几句E文的意思 呵呵 不好意思

-007是指查找所有用户都可读、写、执行的文件,要小心呀~~~

解释解释?

find -name “.*” -perm -007 和 find -name “.*” -perm 777 有区别吗?

-007是怎么来得呢?

不过有一个问题

我用 find . -perm -100 会列出当前目录 . , 这是为什么呢?

下面引用由explover在 2002/10/01 06:15am 发表的内容:

-007是指查找所有用户都可读、写、执行的文件,要小心呀~~~

-007是查找含其它用户(不同组,非属主)可读,写,执行的文件.并不一定要同组可读写,-是指最少权限为007.

下面引用由一颗小白菜在 2002/10/01 10:16am 发表的内容:

OK了, 呵呵

不过有一个问题

我用 find . -perm -100 会列出当前目录 . , 这是为什么呢?

这种方法不会准确的找出目录的. -100是指权限至少是属主可运行.

在unix系统下,你可以拥有对目录文件的执行权你才可以进入一个目录.这便是目录文件被列出的原因.

find . -perm -001 -print找到往往是目录文件.

我的意思当然不是使用这种方法来找目录,只不过不明白其中的 -100 意义了

那以此类推,是不是 -010是指权限至少是owner同组可执行的吗?也就是说其实这里的010和-是分开的,-表示一个至少的意思,而且010才是真正用来描述权限位的?

这样子就明白了 谢谢你噢

将find出来的东西拷到另一个地方?

find *.c -exec cp ‘{}’ /tmp ‘;’

如果有特殊文件,可以用cpio,也可以用这样的语法:

find dir -name filename -print | cpio -pdv newdir

找出磁盘中某个大小范围内的文件

比如要查找磁盘中大于3M的文件:

find . -size +3000k -exec ls -ld {} ;

如何用find查找某一天更改的文件?

可以使用这一行命令来实现:

A=`find ~ -print` | ls -l –full-time $A 2>/dev/null | grep “Jun 27″ | grep 1998

使用find 命令查找某个时间段的shell怎么写。比如11点到12点的。thanks

创建一个脚本judgetime,内容如下:

ls -l $*|awk ‘{split($8,hour,”:”);if((hour[1]>23 || hour[1] < 1)&&hour[1]<24)print}’

到要查找的目录下,运行

find ./ -name “*” -exec judgetime {} \;

注意时间格式为24小时制。

thank you ,如果我要精确到分钟呢

touch -t 04241112 starttemp #精确到12分钟

touch -t 04241220 endtemp #截止到12点20

find [dir] -newer starttemp -a ! -newer endtemp -exec ls -l {} \;

newer?

那昨天12:10文件如何呢?

每天执行的时候,用当天的日期和时间戳替换一下不就行了吗?

我不知道他是不是把所有的11:00~12:00的都找出来,是不是只执行一次还是每天都执行?

这种情况俺猜想是自己的东西放在哪忘了,只记得当时是深夜了。

有道理!

不愧是斑竹!

不光知道怎么解决问题,还知道在什么情况下出现这类问题,佩服佩服!

问题又出现了。创建这个文件的时候。本来应该是时间的一栏现在写上了2002,而不是12:00.

等到12:00过了吧!

删除指定日期的文件

find ./ -name 文件名 -exec rm -f {} \;

例:删除当前30天内没用过的文件,用如下命令:

find / -atime +30 -exec rm -f {} \;

我自己试着写了一小段SHELL,也用ll ,grep, rm 几个命令,用起来还差强人意。

对过滤出来的文件名列表中用了一个FOR语句,再执行rm 。现在我想把这段SHELL 扩展一下让它每天定时运行将 n 天前的文件删掉,有没有人能给我一些提示,谢谢!

还有个问题,对于前面那位朋友提到的”find / -atime +30 -exec rm -f {} \;

“方法,我很早就试过几次,不过好像都不太对,参数 -atime n 是查找n天前被访问过的文件,我不明白的是这里的时间参照点是什么,以及这个n天是怎么计算的。

问 题二、对于”ll |cut -f 1” 这个命令我是不是用错了,我只想取出 ll 中列出的文件名,但用cut -f 命令做不到 ,我只好换用 ll |cut -c 59- 这种方式得到我要的文件名,but it’s a pool idear !我也试过用awk ,好像也不对,看看大家可不可以给我一些小小的提醒,TKS SO MUCH

问题三、如何改变 I结点 的日期格式 我现在的系统显示的格式是:

-rw-r—– 1 msahz01 users 2253 2002年2月 2日 poheader.i

我想把这换成

-rw-rw-rw- 1 house users 2193 Apr 19 2001 hkdisp.p

如何才能做到这点?

awk 应该可以

ll | awk ‘{print $9}’

删除多少天之前的文件

find /yourpath -mtime +31 -exec rm {} \;

find /yourpath -mtime +366 -exec rm {} \;

find中, -ctime, -mtime及其-atime有何区别

请问 -ctime 和 -mtime 有什么关系 ?

如果父目录的 ctime 改变, 那它下面的文件的 ctime 就会自动都改了吗 ?

-ctime 和 -mtime ,-atime 这些信息是存在哪儿呢 ?

我用 -mtime -1 找到了新建或改的文件.

但怎样才能找到一天内 mv 来的文件呢( 它们的时间是原有的时间,早于一天 ) ?

用-newer选项啊。

你可以先touch一个你想要的时间的文件如下:

$ touch -t 08190800 test

$ ls -l test

-rw-r–r– 1 dba other 0 Aug 19 08:00 test

然后

$ find . -newer test -print

.

./.sh_history

$ ls -l .sh_history

-rw——- 1 dba other 154 Aug 20 17:39 .sh_history

用touch可以写出你想要的任何时间的文件,然后用-newer ,! -newer选项即可成功。

1.ctime含inode信息修改的时间.mtime只指文件内容建立或修改的时间.

2 不会.

3.这些信息应该是存在文件系统的超级块里.

我查了书 -ctime 是指 inode 的改变(或称文件的状态改变).

请问 inode 存了哪些信息 ?

做了些小测试,-mtime 改, -ctime 一定也改.

改文件名, -ctime 也会改.

谁能回答 i-node 存了哪些东西 ?

vi /usr/include/sys/inode.h

班主,我不能 access /usr/include/sys/inode.h .

摘书如下:

Directories contain directory entries. Each entry contains a file or subdirectory name and an index node reference number (i-node number). To increase speed and enhance use of disk space, the data in a file is stored at various locations in the computer’s memory. The i-node contains the addresses used to locate all the scattered blocks of data associated with a file. The i-node also records other information about the file including time of modification and access, access modes, number of links, file owner, and file type.

可我发现 -atime 改了, -ctime 还没改. why ?

( 我先 cat 一个 ASCII 文件,再用 -atime -1 有它用 -ctime -1 居然没有它.)

着岂不跟 inode 信息改变, ctime 就改矛盾吗?

我不同意你贴出来的那段文章,正如我提到的那样,atime,ctime,mtime是放到超级块里,在sco unix下是一种叫stat的结构.(stat_32),不同的系统文件系统可能不同.

sco 下inode的结构如下:

typedef struct inode

{

struct inode *i_forw; /* inode hash chain */

struct inode *i_back; /* ‘’ */

struct inode *av_forw; /* freelist chain */

struct inode *av_back; /* ‘’ */

int *i_fsptr; /* “typeless” pointer to fs dependent */

ino32_t i_number; /* i number, 1-to-1 with dev address */

ushort i_ftype; /* file type = IFDIR, IFREG, etc. */

short i_fstyp; /* File system type */

off_t i_size; /* size of file */

ushort i_uid; /* owner */

ushort i_gid; /* group of owner */

ushort i_flag;

ushort i_want; /* i_flag extension to avoid MP races */

ushort i_count; /* reference count */

short i_nlink; /* directory entries */

dev_t i_rdev; /* Raw device number */

#define i_namtype i_rdev /* i_ftype==IFNAM subtype */

dev_t i_dev; /* device where inode resides */

struct mount *i_mton;/* ptr to mount table entry that */

/* this directory is mounted on */

struct region *i_rp; /* ptr to shared region if any */

struct stdata *i_sp; /* ptr to associated stream */

struct iisem *isem; /* ptr to XENIX semaphores */

struct iisd *isd; /* ptr to XENIX shared data */

} i_un;

#define i_mnton i_un.i_mton /* i_ftype==IFDIR IMOUNT */

#define i_rptr i_un.i_rp /* i_ftype==IFREG || i_ftype==IFBLK */

#define i_sptr i_un.i_sp /* i_ftype==IFCHR || i_ftype==IFIFO */

#define i_sem i_un.isem /* i_ftype==IFNAM && i_namtype==IFSEM */

#define i_sd i_un.isd /* i_ftype==IFNAM && i_namtype==IFSHD */

struct fstypsw *i_fstypp; /* ptr to file system switch FSPTR */

long *i_filocks; /* pointer to filock (structure) list */

unsigned long i_mappages; /* number of pages currently cached */

unsigned long i_vcode; /* read-ahead block save (NFS) */

short i_wcnt; /* write open count or ITEXT count */

struct lockb i_cilock; /* tas to synchronize i_flag changes */

ushort i_rdlocks; /* count of non-exclusive lockers */

} inode_t;

所以,访问一个文件不能改变inode信息.

使用chown, chgrp, chmod命令可以很好的比较mtime和ctime

chown改变一个文件的属主,用ctime可以找到,用mtime便找不到.

试试看.

多谢斑竹! 我是在 Solaris 上面试的.我是对 -ctime 不明白.

试的结果如下:

修改文件,-mtime 改了, -ctime 也会改.

访问文件,-atime 改了, -ctime 没变.

chown, chgrp, chmod,mv, 都会使 -ctime 改变,但不影响 -atime 和 -mtime.

touch 可以改 -mtime and/or -atime,但 touch -a 只改访问时间时,-ctime也改了.

touch -m 改修改时间时,-ctime当然也改了.

好象还有别的很多东西可以令 -ctime 改变, 搞不清楚.

有什么方法可以显示 -mtime,atime,ctime 吗?

可以用 -ctime 来实现对目录的增量文件进行备份或 transfer 吗 ?

多谢!

没有什么工具显示,(可能是俺不知道)

把下面程序里的st_mtime换成st_ctime,或st_atime便可以得到你要的了.

#include

int

main (int argc, char **argv)

{

struct stat buf;

char date[80];

char fname[80];

printf(“Enter filename (with full path) to check mtime : “);

scanf(“%s”,fname);

stat(fname, &buf);

printf (“mtime (in sec) of %s = %ld\n”, fname, buf.st_mtime);

strcpy(date, ctime((time_t *)&(buf.st_mtime)));

printf (“mtime (in date) of %s = %s\n”, fname, date);

}

至于文件备份,有什么不可以的么?

mtime ls -l 最近修改文件内容的时间

atime ls -lu 最近访问文件的时间

ctime ls -li 最近文件有所改变的状态 ,如文件修改,属性\属主 改变 ,节点 ,链接变化等 ,应该是不拘泥只是时间前后的改变

俺看了ls的帮助,以为只是按ctime或atime排序,显示的时间还是mtime.

仔细比较了一下,ayhan说的是对的.谢谢ayhan.

多谢 ahyan 提示 ! 我在 Solaris 上试过如下:

mtime 用 ls -l 看到

atime 用 ls -lu 看到

ctime 用 ls -lc 看到. (ls -li 只有 inode number)

摘书如下:

-c Uses time of last modification of the i-node (file

created, mode changed, and so forth) for sorting (-t)

or printing (-l or -n).

-u Uses time of last access instead of last modification

for sorting (with the -t option) or printing (with the

-l option).

-i For each file, prints the i-node number in the first

column of the report.

 

分类: Linux命令大全 标签:

常用命令速查备忘

2017年1月20日 评论已被关闭

常用命令速查备忘
http://blog.chinaunix.net/uid-26495963-id-3184804.html
一. 启动,关机,登入,登出相关命令

[login] 登录

[logout] 登出

[exit] 登出

[shutdown] 停止系统

[halt] 停止系统

[reboot] 重启动

[poweroff] 切断电源

[sync] 把内存里的内容写入磁盘

[lilo] 安装lilo启动管理程序

[grub] 安装lilo启动管理程序

二. Shell相关命令
[chsh] 切换Shell

[history] 显示命令履历

[alias] 设置命令别名

[unalias] 取消命令别名

[which] 显示命令所在位置

[type] 查询命令种类

[echo] 显示字符串或者变量内容

[set] 设置/显示Shell变量

[printenv] 显示环境变量

[export] 设置环境变量

[env] 设置临时环境变量

[unset] 释放环境变量

[setenv] 设置环境变量

[unsetenv] 释放环境变量

[source] 执行文件当中的命令

[man] 查询命令手册

[info] 查询超文本命令手册

[whatis] 显示命令简介

[apropos] 通过关键字查询手册

三. 用户管理相关命令

[su] 切换到其他用户

[useradd] 追加用户

[adduser] 追加用户

[userdel] 删除用户

[usermod] 修改用户设置

[chfn] 修改用户私人信息

[groupadd] 追加组

[groupdel] 删除组

[groupmod] 修改组设置

[passwd] 更改密码

[whoami] 显示用户名

[logname] 显示登录用户帐号

[users] 显示所有登录用户信息

[who] 查询登录用户信息

[w] 查询登录用户信息

[id] 显示指定用户的ID信息

[groups] 显示指定用户的所属组

[finger] 显示指定用户的个人信息

[mesg] 开关与他人收发消息

[write] 给其他用户发消息

[wall] 给所有用户发消息

[talk] 和其他用户聊天

四. 系统消息相关命令

[top] 提供了实时的对系统处理器的状态监视

[date] 显示/设置当前时间

[uptime] 显示系统运行时间

[arch] 显示机器的核心构架(如i386)

[uname] 显示操作系统信息

[tty] 显示终端名

[last] 显示登录/登出在履历

[lastb] 显示非法登录信息

[dumpkeys] 显示当前键盘配置

[loadkeys] 变更键盘配置

[df] 查询磁盘使用信息

[du] 查询磁盘使用信息

[dmesg] 显示系统启动消息

[script] 保存输入输出到文件

五. 文件操作相关命令

[ls] 显示文件列表

[tree] 显示目录树

[pwd] 显示当前路径

[cd] 更改当前路径

[pushd] 追加路径到目录堆栈

[popd] 从目录堆栈删除路径

[dirs] 显示目录堆栈的内容

[mkdir] 创建路径

[rmdir] 删除路径

[cp] 复制文件/目录

[rm] 删除文件/目录

[mv] 移动文件/目录,修改文件名

[chown] 更改文件/目录的所有者

[chgrp] 修改文件/目录的所有组

[chmod] 修改文件/目录的权限

[touch] 更改文件时间

[ln] 建立文件/目录链接

[find] 查找文件

[whereis] 显示文件存在的路径名

[file] 查询文件种类

[size] 查询文件大小

六. 文件编辑相关命令

[cat] 显示文件内容

[tee] 输出到文件和屏幕

[more] 分屏显示文件内容

[less] 分屏显示文件内容

[head] 显示文件头部内容

[tail] 显示文件尾部内容

[fold] 折叠显示长行

[sort] 排列文件的行

[cmp] 比较文件内容

[diff] 显示文件差异

[nkf] 更改日语文件编码

[dd] 变更文件之后复制

[wc] 统计文本单词数,文件大小等

[split] 分割文件

[paste] 以行连接文件

[join] 以字段连接文件

[grep] 查询文字

[uniq] 过滤重复部分显示文件内容

[tr] 替换文字

[sed] 替换文字

[vi] vi文字编辑器

七. 压缩/解压缩相关命令

[tar] 压缩/解压缩文件

[compress] 压缩/解压缩文件

[uncompress] 解压缩

[gzip] 压缩/解压缩文件

[gunzip] 解压缩

[zcat] 显示压缩文件的内容

[lha] 压缩/解压缩文件

[uuencode] 把二进制文件编码为文本文件

[uudecode] 把经过编码的文本文件还原为二进制文件

八. MS-DOS工具集

[mtools]命令

[mdir] 显示文件列表

[mcd] 改变当前目录

[mmd] 新建目录

[mrd] 删除目录

[mdeltree] 删除目录树

[mcopy] 复制文件

[mdel] 删除文件

[mmove] 移动文件

[mren] 更改文件或目录名

[mattrib] 修改文件属性

[mtype] 显示文件内容

[mdu] 查询文件或目录大小

[minfo] 显示磁盘信息

[mformat] 以MS-DOS方式格式化磁盘

[mlabel] 设置磁盘标签

九. 控制外部设备相关命令

[mount] mount上设备

[umount] 解除已经mount上的设备

[eject] 弹出(CD/DVD等)

[fdformat] 格式化软盘

[fdisk] 配置/显示硬盘分区

[mkfs] 格式化磁盘分区

[fsck] 检查/修复磁盘错误

[lpr] 打印到打印机

[lprm] 中断打印任务

[lpq] 显示打印任务的状态

[lpc] 管理/控制打印任务

[ifconfig] 显示/设定NIC配置

十. 进程及任务管理相关命令

[ps] 显示正在运行的进程

[jobs] 显示后台运行任务

[fg] 把任务切换到前台

[bg] 把任务切换到后台

[kill] 中止进程或任务

[killall] 中止进程或任务

[wait] 等待进程或任务的结束

[at] 设置定时执行任务

[atq] 显示尚未执行的任务

[atrm] 删除定时执行任务

[batch] 在系统负荷减轻的时候执行任务

[nice] 改变优先度并执行任务

[nohup] 在后台执行任务,Logout之后也不退出

[sleep] 休眠一定的时间

[crond] 用来定期执行程序的命令

[screen] 可以在多个进程之间多路复用一个物理终端的窗口管理器

十一. 网络管理相关命令

[netstat] 显示当前网络连接状况

[route] 显示/设置路由

[host] 显示网络主机情况

[hostname] 显示/设置当前主机的名字

[ping] 确认和远程机器的连接情况

[traceroute] 显示路由信息

[rwho] 查询网上机器的登陆用户

[ruptime] 查询网上机器的系统运行时间

[rlogin] 登陆到远程机器

[telnet] 用telnet登陆到远程机器

[rsh] 给远程机器发送命令

[rcp] 在远程机器之间复制文件

[mail] 收取邮件

[sendmail] 发送邮件

[mailq] 确认邮件队列

[ftp] 用ftp传输文件

十二. 其他命令

[cal] 显示日历

[clear] 清屏

[gcc] 编译C语言代码

[as] 汇编

[bc] 计算

[rpm]Redhat的包管理

[dpkg] Debain的包管理

[installpkg] Slackware的包安装(删除命令则是removepkg)

[xf86setup ,turboxfg,Xconfigurator] 配置X服务

[startx] 启动 X-Window 图形界面

分类: Linux命令大全 标签:

用curl和wget命令远程查看服务器信息

2017年1月10日 评论已被关闭

用curl和wget命令远程查看服务器信息
http://blog.csdn.net/androidzhaoxiaogang/article/details/8186027
curl -I www.csdn.net
TTP/1.1 200 OK
erver: nginx/0.7.68
ate: Thu, 15 Nov 2012 03:09:17 GMT
ontent-Type: text/html; charset=utf-8
onnection: keep-alive
ary: Accept-Encoding
ache-Control: max-age=900
ontent-Length: 132193
ontent-Location: http://www.csdn.net/index.htm
ast-Modified: Thu, 15 Nov 2012 03:01:12 GMT
ccept-Ranges: bytes
Tag: W/”1e281678ddc2cd1:1e7e”
-UA-Compatible: IE=EmulateIE7
-Powered-By: ASP.NET
$ wget -S –spider www.baidu.com
开启 Spider 模式。检查是否存在远程文件。
–2012-11-15 11:16:25– http://www.baidu.com/
正在解析主机 www.baidu.com (www.baidu.com)… 119.75.217.56, 119.75.218.77
正在连接 www.baidu.com (www.baidu.com)|119.75.217.56|:80… 已连接。
已发出 HTTP 请求,正在等待回应…
HTTP/1.1 200 OK
Date: Thu, 15 Nov 2012 03:16:27 GMT
Server: BWS/1.0
Content-Length: 9803
Content-Type: text/html;charset=gbk
Cache-Control: private
Expires: Thu, 15 Nov 2012 03:16:27 GMT
Set-Cookie: BAIDUID=D9437ABF9E8126F93E0DD75AB654B85B:FG=1; expires=Thu, 15-Nov
-42 03:16:27 GMT; path=/; domain=.baidu.com
P3P: CP=” OTI DSP COR IVA OUR IND COM ”
Connection: Close
长度:9803 (9.6K) [text/html]
存在远程文件且该文件可能含有更深层的链接,
但不能进行递归操作 — 无法取回。

分类: Linux命令大全 标签: ,

-bash: crontab: command not found

2016年12月16日 评论已被关闭

-bash: crontab: command not found
http://blog.163.com/ydmx_lei/blog/static/77053405201384111426238/
操作步骤

1. 确认crontab是否安装:

执行 crontab 命令如果报 command not found,就表明没有安装

2. 安装 crontab

执行 yum install -y vixie-cron

3. 确认是否安装成功:

执行 crontab -l

4. 看是否设置了开机自动启动

chkconfig –list crond

5. 启动crontab

service crond start

HTTP 的重定向301,302,303,307

2016年12月14日 评论已被关闭

HTTP 的重定向301,302,303,307
http://blog.sina.com.cn/s/blog_62ec29160101f3u3.html
301 永久重定向,告诉客户端以后应从新地址访问.
302 作为HTTP1.0的标准,以前叫做Moved Temporarily ,现在叫Found. 现在使用只是为了兼容性的处理,包括PHP的默认Location重定向用的也是302.
但是HTTP 1.1 有303 和307作为详细的补充,其实是对302的细化
303:对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。
307:对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。
实际测试:
测试内容:
写一个测试的test.html代码,发起post请求到test.php页面中
test.php页面分别给出3种重定向处理,都跳到test2.php
test2.php打印出post的结果
(至于怎么写..自己查手册吧,PHP发送头很容易.)
….
301 => “HTTP/1.1 301 Moved Permanently”,
302 => “HTTP/1.1 302 Found”,
303 => “HTTP/1.1 303 See Other”,
307 => “HTTP/1.1 307 Temporary Redirect”,
….
测试结果:
301,302和303的处理结果是一样的,直接跳转到test2.php,post没有内容
307的会重新post请求到test2.php,并且给出页面提示

分类: Linux命令大全 标签:

curl用法:获取网站的header头及状态码

2016年12月14日 评论已被关闭

curl用法:获取网站的header头及状态码
http://www.codesec.net/view/217688.html
curl命令最常用的方法是使用参数-I 获取域名或IP的header信息,包括HTTP返回状态码,server类型,文本类型,缓存时间等等;监控web服务时也常用此方法判断web服务是否正常;

监控web服务,可以使用curl获取网站的header头,查看返回值是否是200 OK,作为判断web服务正常的一个标准;

使用curl -I 可以获取,如果提取第一行信息时,会出现一些不需要的信息,那我们该怎么取呢?

[baby@localhost ~]$ curl -I mofansheng.blog.51cto.com
HTTP/1.1 200 OK
Server: Tengine
Date: Thu, 15 Oct 2015 06:10:17 GMT
Content-Type: text/html
Connection: keep-alive
Keep-Alive: timeout=10
Vary: Accept-Encoding
Set-Cookie:phpSESSID=8c0bac037cf2cfd8b87e7dde079eb3bf; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: lastvisit=0%091444889417%09%2Findex.php%3F; expires=Fri, 14-Oct-2016 06:10:17 GMT; path=/; domain=.blog.51cto.com
If-Modified-Since: Sat, 10 Oct 2015 16:00:00 GMT
Load-Balancing: web48
Load-Balancing: web48
使用grep过滤第一行,发现出来很多不需要的信息

[baby@localhost ~]$ curl -I mofansheng.blog.51cto.com|grep “OK”
% Total % Received % Xferd Average Speed Time Time Time Current

Dload Upload Total Spent Left Speed

0 0 0 0 0 0 0 0 –:–:– –:–:– –:–:– 0

HTTP/1.1 200 OK

解决方法为:

man curl 查看是否有具体参数可以达到我们需要的结果;

-s/–silent

Silent or quiet mode. Don’t show progress meter or error messages.

-s 是沉默,静默模式,意思为不输出进度表或错误信息;

[baby@localhost ~]$ curl -I -s mofansheng.blog.51cto.com|grep “OK”
HTTP/1.1 200 OK
一条命令取出200的方法:

[root@linuxidc ~]# curl -s -w “%{http_code}” -o /dev/null www.codesec.net
200
其他方法:可以把错误输出定向到系统黑洞里,再进行过滤

[baby@localhost ~]$ curl -I mofansheng.blog.51cto.com 2>/dev/null|grep “OK”
HTTP/1.1 200 OK
[baby@localhost ~]$ curl -I mofansheng.blog.51cto.com 2>/dev/null|head -n1
HTTP/1.1 200 OK
本文地址:http://www.codesec.net/Linux/2015-11/125325.htm

分类: Linux命令大全 标签:

shell curl 取得HTTP返回的状态码

2016年12月14日 评论已被关闭

 

shell curl 取得HTTP返回的状态码

 

curl -I -m 10 -o /dev/null -s -w %{http_code} www.baidu.com

 

-I 仅测试HTTP头

-m 10 最多查询10s

-o /dev/null 屏蔽原有输出信息

-s silent

-w %{http_code} 控制额外输出

 

绑定 ip 测试:

curl -I -m 10  -H “www.baidu.com”  http://220.181.112.143 -o /dev/null -s -w %{http_code}

分类: Linux命令大全 标签:

linux shell 中的sleep命令

2016年12月14日 评论已被关闭

linux shell 中的sleep命令
http://www.cnblogs.com/xd502djj/p/3612131.html
在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小时)
sleep 1 睡眠1秒
sleep 1s 睡眠1秒
sleep 1m 睡眠1分
sleep 1h 睡眠1小时

 

Shell脚本中让进程休眠的方法(sleep用法)
http://www.jb51.net/article/57198.htm

这篇文章主要介绍了Shell脚本中让进程休眠的方法,本文讲解的就是sleep的用法,可以实现睡觉若干秒、若干分钟、若干小时,需要的朋友可以参考下
有时候写Shell的脚本,用于顺序执行一系列的程序。 有些程序在停止之后并没能立即退出,就例如有一个 tomcat 挂了,就算是用 kill -9 命令也还没瞬间就结束掉。
这么如果 shell 还没等其退出就接着执行下一行,这么就出乱子了。 刚知道了原来 shell 也能有 sleep 的参数。
复制代码 代码如下:

sleep 1 睡眠1秒
sleep 1s 睡眠1秒
sleep 1m 睡眠1分
sleep 1h 睡眠1小时
用法如下,例如重启tomcat:
复制代码 代码如下:

#!/bin/sh
/opt/tomcat/bin/shutdown.sh
sleep 3 #等3秒后执行下一条
/opt/tomcat/bin/startup.sh

分类: Linux命令大全 标签:

/bin/bash和/bin/sh的区别

2016年12月14日 评论已被关闭

/bin/bash和/bin/sh的区别

http://www.cnblogs.com/baizhantang/archive/2012/09/11/2680453.html

/bin/sh与/bin/bash的细微区别

原文:不详

在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本。
目前研发送测的shell脚本中主要有以下两种方式:
(1) #!/bin/sh
(2) #!/bin/bash
在这里求教同福客栈的各位大侠们一个问题:
以上两种方式有什么区别?对于脚本的实际运行会产生什么不同的影响吗?

脚本test.sh内容:
#!/bin/sh
source pcy.sh #pcy.sh并不存在
echo hello
执行./test.sh,屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
由此可见,在#!/bin/sh的情况下,source不成功,不会运行source后面的代码。
修改test.sh脚本的第一行,变为#!/bin/bash,再次执行./test.sh,屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
hello
由此可见,在#!/bin/bash的情况下,虽然source不成功,但是还是运行了source后面的echo语句。
但是紧接着我又试着运行了一下sh ./test.sh,这次屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
表示虽然脚本中指定了#!/bin/bash,但是如果使用sh 方式运行,如果source不成功,也不会运行source后面的代码。

为什么会有这样的区别呢?

junru同学作了解释

1. sh一般设成bash的软链
[work@zjm-testing-app46 cy]$ ll /bin/sh
lrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash
2. 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
3. 也就是说 /bin/sh 相当于 /bin/bash –posix

所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别

so,可以预想的是,如果第一行写成 #!/bin/bash –posix,那么脚本执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)

例如:
[root@localhost yuhj]# head -n1 x.sh
#!/bin/sh
[root@localhost yuhj]# ./x.sh

./x.sh: line 8: syntax error near unexpected token `<‘
./x.sh: line 8: ` while read line; do { echo $line;((Lines++)); } ; done < <(route -n)’
[root@localhost yuhj]#

[root@localhost yuhj]# head -n1 x.sh
#!/bin/bash
[root@localhost yuhj]#./x.sh

Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.202.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.202.2 0.0.0.0 UG 0 0 0 eth0
Number of lines read = 4
[root@localhost yuhj]#

[root@localhost yuhj]# head -n1 x.sh
#!/bin/bash –posix
[root@localhost yuhj]#
[root@localhost yuhj]# ./x.sh

./x.sh: line 8: syntax error near unexpected token `<‘
./x.sh: line 8: ` while read line; do { echo $line;((Lines++)); } ; done < <(route -n)’

[root@localhost yuhj]# whereis sh bash
sh: /bin/sh /usr/share/man/man1/sh.1.gz /usr/share/man/man1p/sh.1p.gz
bash: /bin/bash /usr/share/man/man1/bash.1.gz

[root@localhost yuhj]# ll /bin/sh /bin/bash
-rwxr-xr-x 1 root root 735004 May 25 2008 /bin/bash
lrwxrwxrwx 1 root root 4 Jan 29 00:39 /bin/sh -> bash
[root@localhost yuhj]#

分类: Linux命令大全 标签:

Linux命令 find和mv的结合使用:查找文件,移动到某个目录

2016年12月13日 评论已被关闭

Linux命令 find和mv的结合使用:查找文件,移动到某个目录 http://blog.csdn.net/hardwin/article/details/7711635

Linux命令 find和mv的结合使用:查找文件,移动到某个目录
http://blog.csdn.net/hardwin/article/details/7711635

把当前目录下面的file(不包括目录),移动到/opt/shell

find . -type f -exec mv {} /opt/shell \;

find . -type f | xargs -I ‘{}’ mv {} /opt/shell

下面from http://weiruoyu.blog.51cto.com/951650/832497

find多少天以前的文件,按时间移动,并分批打包

显示前十个文件

[root@localhost smgpbi]# ls -1 | sort -u | head -10

1.首先查看文件个数,进入所在的文件

# find . -name “*” | wc -l

或者

# ll |grep “^-” |wc -l

2.查看文件个数

查看120天钱的文件个数

# find . -mtime +120 | wc -l

一般如果是小文件,控制在10-20万左右。

解释:-mtime +30 –设置时间为30天前;

-exec mv –查找完毕后执行移动操作;

3.按照时间移动到指定目录里

# find . -mtime +90 -exec mv {} /var/tmp/date_90 \;

4.计算大小

# du -sh date_90

大小一般控制在10-15G最好

5.压缩并打包

#tar -zcvf date_90.tar.gz date_90/

分类: Linux命令大全 标签:

linux各种IPC机制

2016年12月11日 评论已被关闭

linux各种IPC机制

http://blog.sina.com.cn/s/blog_62a9b1bb0100t2a7.html
原文地址:linux各种IPC机制(转)作者:jianpengliu
原帖发表在IBM的developerworks网站上,是一个系列的文章,作者郑彦兴,通过讲解和例子演示了Linux中几种IPC的使用方式,我觉得很好,在这里做一个保留,能看完的话Linux IPC的基础是没有问题的了。
一)Linux环境进程间通信(一)管道及有名管道
http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/
二)Linux环境进程间通信(二): 信号
上:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
下:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html
三)Linux环境进程间通信(三)消息队列
http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/
四)Linux环境进程间通信(四)信号灯
http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/
五)Linux环境进程间通信(五): 共享内存
上:http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html
下:http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html
六)Linux环境进程间通信(六): socket
http://www.ibm.com/developerworks/cn/linux/l-ipc/

==============================================================================================

linux下进程间通信的几种主要手段简介:

管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,如close、read、write等等。
管道的主要局限性正体现在它的特点上:

只支持单向数据流;
只能用于具有亲缘关系的进程之间;
没有名字;
管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);
管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;
管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。
管道常用于两个方面:(1)在shell中时常会用到管道(作为输入输入的重定向),在这种应用方式下,管道的创建对于用户来说是透明的;(2)用于具有亲缘关系的进程间通信,用户自己创建管道,并完成读写操作。
FIFO可以说是管道的推广,克服了管道无名字的限制,使得无亲缘关系的进程同样可以采用先进先出的通信机制进行通信。
管道和FIFO的数据是字节流,应用程序之间必须事先确定特定的传输”协议”,采用传播具有特定意义的消息。
要灵活应用管道及FIFO,理解它们的读写规则是关键。
一、信号及信号来源
信号本质
信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。
信号来源
信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。

三、进程对信号的响应
进程可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;(3)执行缺省操作,Linux对每种信号都规定了默认操作,详细情况请参考[2]以及其它资料。注意,进程对实时信号的缺省反应是进程终止。
Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。
一、信号生命周期
从信号发送到信号处理函数的执行完毕
对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生;信号在进程中注册完毕;信号在进程中的注销完毕;信号处理函数执行完毕。相邻两个事件的时间间隔构成信号生命周期的一个阶段。
linux IPC快餐(转) – xsh8637 – 第七天堂

消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像”即时”的通信方式,它要求接受信号的进程在某个时间范围内对信号做出反应,因此该信号最多在接受信号进程的生命周期内才有意义,信号所传递的信息是接近于随进程持续的概念(process-persistent),见 附录 1;管道及有名管道及有名管道则是典型的随进程持续IPC,并且,只能传送无格式的字节流无疑会给应用程序开发带来不便,另外,它的缓冲区大小也受到限制。
消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的(参见 附录 1)。

三、消息队列的限制
每个消息队列的容量(所能容纳的字节数)都有限制,该值因系统不同而不同。
小结:
消息队列与管道以及有名管道相比,具有更大的灵活性,首先,它提供有格式字节流,有利于减少开发人员的工作量;其次,消息具有类型,在实际应用中,可作为优先级使用。这两点是管道以及有名管道所不能比的。同样,消息队列可以在几个进程间复用,而不管这几个进程是否具有亲缘关系,这一点与有名管道很相似;但消息队列是随内核持续的,与有名管道(随进程持续)相比,生命力更强,应用空间更大。

信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。
一、信号灯概述
信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。信号灯有以下两种类型:

二值信号灯:最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。
注:二值信号灯能够实现互斥锁的功能,但两者的关注内容不同。信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。
计算信号灯:信号灯的值可以取任意非负值(当然受内核本身的约束)。
五、信号灯的限制
1、 一次系统调用semop可同时操作的信号灯数目SEMOPM,semop中的参数nsops如果超过了这个数目,将返回E2BIG错误。SEMOPM的大小特定与系统,redhat 8.0为32。
2、 信号灯的最大数目:SEMVMX,当设置信号灯值超过这个限制时,会返回ERANGE错误。在redhat 8.0中该值为32767。
3、 系统范围内信号灯集的最大数目SEMMNI以及系统范围内信号灯的最大数目SEMMNS。超过这两个限制将返回ENOSPC错误。redhat 8.0中该值为32000。
4、 每个信号灯集中的最大信号灯数目SEMMSL,redhat 8.0中为250。 SEMOPM以及SEMVMX是使用semop调用时应该注意的;SEMMNI以及SEMMNS是调用semget时应该注意的。SEMVMX同时也是semctl调用应该注意的。

共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。
Linux的2.2.x内核支持多种共享内存方式,如mmap()系统调用,Posix共享内存,以及系统V共享内存。linux发行版本如Redhat 8.0支持mmap()系统调用及系统V共享内存,但还没实现Posix共享内存,本文将主要介绍mmap()系统调用及系统V共享内存API的原理及应用。

二、mmap()及其相关系统调用
mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。
注:实际上,mmap()系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。
结论:
共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制。共享内存可以通过mmap()映射普通文件(特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现。应用接口和原理很简单,内部机制复杂。为了实现更安全通信,往往还与信号灯等同步机制共同使用。
共享内存涉及到了存储管理以及文件系统等方面的知识,深入理解其内部机制有一定的难度,关键还要紧紧抓住内核使用的重要数据结构。系统V共享内存是以文件的形式组织在特殊文件系统shm中的。通过shmget可以创建或获得共享内存的标识符。取得共享内存标识符后,要通过shmat将这个内存区映射到本进程的虚拟地址空间。
一个套接口可以看作是进程间通信的端点(endpoint),每个套接口的名字都是唯一的(唯一的含义是不言而喻的),其他进程可以发现、连接并且与之通信。通信域用来说明套接口通信的协议,不同的通信域有不同的通信协议以及套接口的地址结构等等,因此,创建一个套接口时,要指明它的通信域。比较常见的是unix域套接口(采用套接口机制实现单机内的进程间通信)及网际通信域。

5、网络编程中的其他重要概念
下面列出了网络编程中的其他重要概念,基本上都是给出这些概念能够实现的功能,读者在编程过程中如果需要这些功能,可查阅相关概念。
(1)、I/O复用的概念
I/O复用提供一种能力,这种能力使得当一个I/O条件满足时,进程能够及时得到这个信息。I/O复用一般应用在进程需要处理多个描述字的场合。它的一个优势在于,进程不是阻塞在真正的I/O调用上,而是阻塞在select()调用上,select()可以同时处理多个描述字,如果它所处理的所有描述字的I/O都没有处于准备好的状态,那么将阻塞;如果有一个或多个描述字I/O处于准备好状态,则select()不阻塞,同时会根据准备好的特定描述字采取相应的I/O操作。
(2)、Unix通信域
前面主要介绍的是PF_INET通信域,实现网际间的进程间通信。基于Unix通信域(调用socket时指定通信域为PF_LOCAL即可)的套接口可以实现单机之间的进程间通信。采用Unix通信域套接口有几个好处:Unix通信域套接口通常是TCP套接口速度的两倍;另一个好处是,通过Unix通信域套接口可以实现在进程间传递描述字。所有可用描述字描述的对象,如文件、管道、有名管道及套接口等,在我们以某种方式得到该对象的描述字后,都可以通过基于Unix域的套接口来实现对描述字的传递。接收进程收到的描述字值不一定与发送进程传递的值一致(描述字是特定于进程的),但是特们指向内核文件表中相同的项。
(3)、原始套接口
原始套接口提供一般套接口所不提供的功能:

原始套接口可以读写一些用于控制的控制协议分组,如ICMPv4等,进而可实现一些特殊功能。
原始套接口可以读写特殊的IPv4数据包。内核一般只处理几个特定协议字段的数据包,那么一些需要不同协议字段的数据包就需要通过原始套接口对其进行读写;
通过原始套接口可以构造自己的Ipv4头部,也是比较有意思的一点。

创建原始套接口需要root权限。
(4)、对数据链路层的访问
对数据链路层的访问,使得用户可以侦听本地电缆上的所有分组,而不需要使用任何特殊的硬件设备,在linux下读取数据链路层分组需要创建SOCK_PACKET类型的

/dev/null 2>&1 解释

2016年12月11日 评论已被关闭

/dev/null 2>&1 解释
http://blog.sina.com.cn/s/blog_62a9b1bb0100shg4.html
原文地址:/dev/null 2>&1 解释作者:Learn_linux

crontab内容 :50 18 5-30 * * /asia/script/myscript.sh 1> /dev/null 2>&1
其中 1> /dev/null 2>&1是什么意思??
dev/null 为系统垃圾箱
&为后台运行
但是 myscript 后面的1 和 /null后面的2 还有 &后面的1是什么意思?

1代表标准输出,2代表错误信息输出.
1>/dev/null 就是指将标准输出定向到空设备,
2>&1,的意思是将错误输出定向到和1一样的输出设备,也同样是空.
换句话说,就是不显示该程序执行过程中的任何信息
cmd >a 2>a 和 cmd >a 2>&1 为什么不同?

cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。

cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。

du 使用详解

2016年12月11日 评论已被关闭

du 使用详解

http://www.lowxp.com/g/article/detail/290

 

du 使用详解 linux查看目录大小 linux统计目录大小并排序 查看目录下所有一级子目录文件夹大小 du -h –max-depth=1 |grep [
发表于 2014-05-05 – 浏览:28879 评论:0 收藏 0
常用命令
du -h –max-depth=1 |grep [TG] |sort #查找上G和T的目录并排序
du -sh #统计当前目录的大小,以直观方式展现

du -h –max-depth=1 |grep ‘G’ |sort #查看上G目录并排序
du -sh –max-depth=1 #查看当前目录下所有一级子目录文件夹大小
du -h –max-depth=1 |sort #查看当前目录下所有一级子目录文件夹大小 并排序

du -h –max-depth=1 |grep [TG] |sort -nr #倒序排

FreeBSD下是这样的
du -hd 1 | sort
du -hd 1 |grep [GT] | sort

du命令功能说明:统计目录(或文件)所占磁盘空间的大小。
语  法:du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][–block-size][–exclude=<目录或文件>] [–max-depth=<目录层数>][–help][–version][目录或文件]
常用参数:
-a或-all 为每个指定文件显示磁盘使用情况,或者为目录中每个文件显示各自磁盘使用情况。
-b或-bytes 显示目录或文件大小时,以byte为单位。
-c或–total 除了显示目录或文件的大小外,同时也显示所有目录或文件的总和。
-D或–dereference-args 显示指定符号连接的源文件大小。
-h或–human-readable 以K,M,G为单位,提高信息的可读性。
-H或–si 与-h参数相同,但是K,M,G是以1000为换算单位,而不是以1024为换算单位。
-k或–kilobytes 以1024 bytes为单位。
-l或–count-links 重复计算硬件连接的文件。
-L<符号连接>或–dereference<符号连接> 显示选项中所指定符号连接的源文件大小。
-m或–megabytes 以1MB为单位。
-s或–summarize 仅显示总计,即当前目录的大小。
-S或–separate-dirs 显示每个目录的大小时,并不含其子目录的大小。
-x或–one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-X<文件>或–exclude-from=<文件> 在<文件>指定目录或文件。
–exclude=<目录或文件> 略过指定的目录或文件。
–max-depth=<目录层数> 超过指定层数的目录后,予以忽略。
–help 显示帮助。
–version 显示版本信息。
linux中的du命令使用示例:
1> 要显示一个目录树及其每个子树的磁盘使用情况
du /home/linux
这在/home/linux目录及其每个子目录中显示了磁盘块数。
2> 要通过以1024字节为单位显示一个目录树及其每个子树的磁盘使用情况
du -k /home/linux
这在/home/linux目录及其每个子目录中显示了 1024 字节磁盘块数。
3> 以MB为单位显示一个目录树及其每个子树的磁盘使用情况
du -m /home/linux
这在/home/linux目录及其每个子目录中显示了 MB 磁盘块数。
4> 以GB为单位显示一个目录树及其每个子树的磁盘使用情况
du -g /home/linux
这在/home/linux目录及其每个子目录中显示了 GB 磁盘块数。
5>查看当前目录下所有目录以及子目录的大小:
du -h .
“.”代表当前目录下。也可以换成一个明确的路径
-h表示用K、M、G的人性化形式显示
6>查看当前目录下user目录的大小,并不想看其他目录以及其子目录:
du -sh user
-s表示总结的意思,即只列出一个总结的值
du -h –max-depth=0 user
–max-depth=n表示只深入到第n层目录,此处设置为0,即表示不深入到子目录。
7>列出user目录及其子目录下所有目录和文件的大小:
du -ah user
-a表示包括目录和文件
8>列出当前目录中的目录名不包括xyz字符串的目录的大小:
du -h –exclude=’*xyz*’
9>想在一个屏幕下列出更多的关于user目录及子目录大小的信息:
du -0h user
-0(杠零)表示每列出一个目录的信息,不换行,而是直接输出下一个目录的信息。
10>只显示一个目录树的全部磁盘使用情况

[maple@linux ~]$
[maple@linux ~]$ du
8 ./test/links
8 ./test/dir/subdir1
8 ./test/dir/subdir2
20 ./test/dir
160 ./test
108 ./test2
1492 .
[maple@linux ~]$
[maple@linux ~]$ du -0
8 ./test/links8 ./test/dir/subdir18 ./test/dir/subdir220 ./test/dir160 ./test108 ./test21492 .[maple@linux ~]$ du -c
8 ./test/links
8 ./test/dir/subdir1
8 ./test/dir/subdir2
20 ./test/dir
160 ./test
108 ./test2
1492 .
1492 total
[maple@linux ~]$
[maple@linux ~]$ du -h
8.0K ./test/links
8.0K ./test/dir/subdir1
8.0K ./test/dir/subdir2
20K ./test/dir
160K ./test
108K ./test2
1.5M .
[maple@linux ~]$
[maple@linux ~]$ du -k
8 ./test/links
8 ./test/dir/subdir1
8 ./test/dir/subdir2
20 ./test/dir
160 ./test
108 ./test2
1492 .
[maple@linux ~]$
[maple@linux ~]$ du -sh
1.5M .
[maple@linux ~]$
[maple@linux ~]$ du -S
8 ./test/links
8 ./test/dir/subdir1
8 ./test/dir/subdir2
4 ./test/dir
132 ./test
108 ./test2
1224 .
[maple@linux ~]$
[maple@linux ~]$ du -Sh –exclude=”sub*”
8.0K ./test/links
4.0K ./test/dir
132K ./test
108K ./test2
1.2M .
[maple@linux ~]$
[maple@linux ~]$ du -h
8.0K ./test/links
8.0K ./test/dir/subdir1
8.0K ./test/dir/subdir2
20K ./test/dir
160K ./test
108K ./test2
1.5M .
[maple@linux ~]$

命令用途
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
命令格式
du [OPTION]… [FILE]…
-a, –all
包括了所有的文件,而不只是目录
–apparent-size
print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be larger due
to holes in (’sparse’) files, internal fragmentation, indirect blocks, and the like
-B, –block-size=SIZE use SIZE-byte blocks
-b, –bytes 以字节为计算单位
-k 以千字节(KB)为计算单位
-m 以兆字节(M)为计算单位
-c, –total 最后加上一个总计(系统缺省)
-D, –dereference-args
dereference FILEs that are symbolic links
-H 跟 – -si效果一样。
-h, –human-readable 以比较阅读的方式输出文件大小信息 (例如,1K 234M 2G)。注:该选项在很多其他命令(df, ls)中也有效。
–si 跟-h 效果一样,只是以1000为换算单位
-l, –count-links 计算所有的文件大小,对硬链接文件,则计算多次。
-L, –dereference 显示选项中所指定符号连接的源文件大小。
-P, –no-dereference 不跟随任何的符号连接(缺省)
-S, –separate-dirs 计算目录所占空间时不包括子目录的大小。
-s, –summarize 只显示工作目录所占总空间
-x, –one-file-system 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-X FILE, –exclude-from=FILE 排除掉指定的FILE
–exclude=PATTERN 排除掉符合样式的文件,Pattern就是普通的Shell样式,?表示任何一个字符,*表示任意多个字符。
–max-depth=N
只列出深度小于max-depth的目录和文件的信息 –max-depth=0 的时候效果跟–s是 一样
使用案例
root@ubuntu:/# cd /home/web/
root@ubuntu:/home/web# du -s
793832 .–不指定FILE名字计算出当前目录所占用的空间大小。
root@ubuntu:/#$ du -sh
776M .–不指定FILE名字计算出当前目录所占用的空间大小。-h选项使得输出结果跟容易阅读(跟上例比较)
root@ubuntu:/#$ du –max-depth=1 -h
–输出当前目录下各个子目录所使用的空间
83M ./java
87M ./build
197M ./jboss
128M ./lib
1.1M ./bin
52K ./synclogs
4.8M ./sql
920K ./conf
52K ./logs
20K ./mail_group
56K ./.svn
144M ./htdocs
56K ./jboss-conf
2.7M ./auto-conf
8.0K ./.mule
23M ./classes
43M ./templates
144K ./project
776M .
找出大文件
磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:
du -s /home/* | sort -nr
[root@SVN svnhome]# du -h –max-depth=1 |grep [TG] |sort -nr
518G ./sichuandian
474G ./zgx
162G ./20kc
98G ./bgong
80G ./s
73G ./yn
44G ./siua12
35G ./cdtielug13
31G ./kifa
22G ./zhhu
22G ./shae1
18G ./eCaker
17G ./1-youswu
16G ./20kc
14G ./sicngda
14G ./be11
6.5G ./service
5.4G ./YNmeeting
5.2G ./YNkangjia
5.0G ./1-1hongqinshan
4.6G ./doucaiku
4.6G ./bunopertion
3.7G ./naax11
2.6G ./yneries
2.6G ./teamalsdu 使用详解 linux查看目录大小 linux统计目录大小并排序 查看目录下所有一级子目录文件夹大小 du -h –max-depth=1 |grep [
发表于 2014-05-05 – 浏览:28880 评论:0 收藏 0
常用命令
du -h –max-depth=1 |grep [TG] |sort #查找上G和T的目录并排序
du -sh #统计当前目录的大小,以直观方式展现

du -h –max-depth=1 |grep ‘G’ |sort #查看上G目录并排序
du -sh –max-depth=1 #查看当前目录下所有一级子目录文件夹大小
du -h –max-depth=1 |sort #查看当前目录下所有一级子目录文件夹大小 并排序

du -h –max-depth=1 |grep [TG] |sort -nr #倒序排

FreeBSD下是这样的
du -hd 1 | sort
du -hd 1 |grep [GT] | sort

du命令功能说明:统计目录(或文件)所占磁盘空间的大小。
语  法:du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][–block-size][–exclude=<目录或文件>] [–max-depth=<目录层数>][–help][–version][目录或文件]
常用参数:
-a或-all 为每个指定文件显示磁盘使用情况,或者为目录中每个文件显示各自磁盘使用情况。
-b或-bytes 显示目录或文件大小时,以byte为单位。
-c或–total 除了显示目录或文件的大小外,同时也显示所有目录或文件的总和。
-D或–dereference-args 显示指定符号连接的源文件大小。
-h或–human-readable 以K,M,G为单位,提高信息的可读性。
-H或–si 与-h参数相同,但是K,M,G是以1000为换算单位,而不是以1024为换算单位。
-k或–kilobytes 以1024 bytes为单位。
-l或–count-links 重复计算硬件连接的文件。
-L<符号连接>或–dereference<符号连接> 显示选项中所指定符号连接的源文件大小。
-m或–megabytes 以1MB为单位。
-s或–summarize 仅显示总计,即当前目录的大小。
-S或–separate-dirs 显示每个目录的大小时,并不含其子目录的大小。
-x或–one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-X<文件>或–exclude-from=<文件> 在<文件>指定目录或文件。
–exclude=<目录或文件> 略过指定的目录或文件。
–max-depth=<目录层数> 超过指定层数的目录后,予以忽略。
–help 显示帮助。
–version 显示版本信息。
linux中的du命令使用示例:
1> 要显示一个目录树及其每个子树的磁盘使用情况
du /home/linux
这在/home/linux目录及其每个子目录中显示了磁盘块数。
2> 要通过以1024字节为单位显示一个目录树及其每个子树的磁盘使用情况
du -k /home/linux
这在/home/linux目录及其每个子目录中显示了 1024 字节磁盘块数。
3> 以MB为单位显示一个目录树及其每个子树的磁盘使用情况
du -m /home/linux
这在/home/linux目录及其每个子目录中显示了 MB 磁盘块数。
4> 以GB为单位显示一个目录树及其每个子树的磁盘使用情况
du -g /home/linux
这在/home/linux目录及其每个子目录中显示了 GB 磁盘块数。
5>查看当前目录下所有目录以及子目录的大小:
du -h .
“.”代表当前目录下。也可以换成一个明确的路径
-h表示用K、M、G的人性化形式显示
6>查看当前目录下user目录的大小,并不想看其他目录以及其子目录:
du -sh user
-s表示总结的意思,即只列出一个总结的值
du -h –max-depth=0 user
–max-depth=n表示只深入到第n层目录,此处设置为0,即表示不深入到子目录。
7>列出user目录及其子目录下所有目录和文件的大小:
du -ah user
-a表示包括目录和文件
8>列出当前目录中的目录名不包括xyz字符串的目录的大小:
du -h –exclude=’*xyz*’
9>想在一个屏幕下列出更多的关于user目录及子目录大小的信息:
du -0h user
-0(杠零)表示每列出一个目录的信息,不换行,而是直接输出下一个目录的信息。
10>只显示一个目录树的全部磁盘使用情况

[maple@linux ~]$
[maple@linux ~]$ du
8 ./test/links
8 ./test/dir/subdir1
8 ./test/dir/subdir2
20 ./test/dir
160 ./test
108 ./test2
1492 .
[maple@linux ~]$
[maple@linux ~]$ du -0
8 ./test/links8 ./test/dir/subdir18 ./test/dir/subdir220 ./test/dir160 ./test108 ./test21492 .[maple@linux ~]$ du -c
8 ./test/links
8 ./test/dir/subdir1
8 ./test/dir/subdir2
20 ./test/dir
160 ./test
108 ./test2
1492 .
1492 total
[maple@linux ~]$
[maple@linux ~]$ du -h
8.0K ./test/links
8.0K ./test/dir/subdir1
8.0K ./test/dir/subdir2
20K ./test/dir
160K ./test
108K ./test2
1.5M .
[maple@linux ~]$
[maple@linux ~]$ du -k
8 ./test/links
8 ./test/dir/subdir1
8 ./test/dir/subdir2
20 ./test/dir
160 ./test
108 ./test2
1492 .
[maple@linux ~]$
[maple@linux ~]$ du -sh
1.5M .
[maple@linux ~]$
[maple@linux ~]$ du -S
8 ./test/links
8 ./test/dir/subdir1
8 ./test/dir/subdir2
4 ./test/dir
132 ./test
108 ./test2
1224 .
[maple@linux ~]$
[maple@linux ~]$ du -Sh –exclude=”sub*”
8.0K ./test/links
4.0K ./test/dir
132K ./test
108K ./test2
1.2M .
[maple@linux ~]$
[maple@linux ~]$ du -h
8.0K ./test/links
8.0K ./test/dir/subdir1
8.0K ./test/dir/subdir2
20K ./test/dir
160K ./test
108K ./test2
1.5M .
[maple@linux ~]$

命令用途
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
命令格式
du [OPTION]… [FILE]…
-a, –all
包括了所有的文件,而不只是目录
–apparent-size
print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be larger due
to holes in (’sparse’) files, internal fragmentation, indirect blocks, and the like
-B, –block-size=SIZE use SIZE-byte blocks
-b, –bytes 以字节为计算单位
-k 以千字节(KB)为计算单位
-m 以兆字节(M)为计算单位
-c, –total 最后加上一个总计(系统缺省)
-D, –dereference-args
dereference FILEs that are symbolic links
-H 跟 – -si效果一样。
-h, –human-readable 以比较阅读的方式输出文件大小信息 (例如,1K 234M 2G)。注:该选项在很多其他命令(df, ls)中也有效。
–si 跟-h 效果一样,只是以1000为换算单位
-l, –count-links 计算所有的文件大小,对硬链接文件,则计算多次。
-L, –dereference 显示选项中所指定符号连接的源文件大小。
-P, –no-dereference 不跟随任何的符号连接(缺省)
-S, –separate-dirs 计算目录所占空间时不包括子目录的大小。
-s, –summarize 只显示工作目录所占总空间
-x, –one-file-system 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-X FILE, –exclude-from=FILE 排除掉指定的FILE
–exclude=PATTERN 排除掉符合样式的文件,Pattern就是普通的Shell样式,?表示任何一个字符,*表示任意多个字符。
–max-depth=N
只列出深度小于max-depth的目录和文件的信息 –max-depth=0 的时候效果跟–s是 一样
使用案例
root@ubuntu:/# cd /home/web/
root@ubuntu:/home/web# du -s
793832 .–不指定FILE名字计算出当前目录所占用的空间大小。
root@ubuntu:/#$ du -sh
776M .–不指定FILE名字计算出当前目录所占用的空间大小。-h选项使得输出结果跟容易阅读(跟上例比较)
root@ubuntu:/#$ du –max-depth=1 -h
–输出当前目录下各个子目录所使用的空间
83M ./java
87M ./build
197M ./jboss
128M ./lib
1.1M ./bin
52K ./synclogs
4.8M ./sql
920K ./conf
52K ./logs
20K ./mail_group
56K ./.svn
144M ./htdocs
56K ./jboss-conf
2.7M ./auto-conf
8.0K ./.mule
23M ./classes
43M ./templates
144K ./project
776M .
找出大文件
磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:
du -s /home/* | sort -nr
[root@SVN svnhome]# du -h –max-depth=1 |grep [TG] |sort -nr
518G ./sichuandian
474G ./zgx
162G ./20kc
98G ./bgong
80G ./s
73G ./yn
44G ./siua12
35G ./cdtielug13
31G ./kifa
22G ./zhhu
22G ./shae1
18G ./eCaker
17G ./1-youswu
16G ./20kc
14G ./sicngda
14G ./be11
6.5G ./service
5.4G ./YNmeeting
5.2G ./YNkangjia
5.0G ./1-1hongqinshan
4.6G ./doucaiku
4.6G ./bunopertion
3.7G ./naax11
2.6G ./yneries
2.6G ./teamals
2.4G ./sichxue
2.4G ./1cm
1.8G ./Yb
1.7T .
1.7G ./ynedate
1.3G ./cddshe
1.2G ./YmD
2.4G ./sichxue
2.4G ./1cm
1.8G ./Yb
1.7T .
1.7G ./ynedate
1.3G ./cddshe
1.2G ./YmD

分类: Linux命令大全 标签:

Logrotate命令整理(有空再整理)

2016年12月8日 评论已被关闭

Logrotate命令整理(有空再整理)

http://blog.chinaunix.net/uid-20281367-id-225550.html

logrotate是个强大的系统软件,它对日志文件(只要文件名固定的)有着一套完整的操作模式,譬如:转储、邮件和压缩等等;但是它也有那么点瑕疵:就是转储的时候,文件大小经常不是预期的,譬如,设置成size 1024,那么转储的时候文件大小可能已经上兆了。原因很简单,因为logrotate是个cron任务,它只能每天(最小轮询单位)轮询一次,至于在这一天内文件大小超过1024,它也无能为力。不管怎么说,logrotate是个非常实用的工具,只要对log临时需要(测试)或要求不高,都可以采用。以下是我对logrotate的理解和整理。

logrotate


LOGROTATE(8)             System Administrator’s Manual            LOGROTATE(8)




NAME

       logrotate - rotates, compresses, and mails system logs


SYNOPSIS

       logrotate [-dv] [-f|--force] [-s|--state file] config_file+


DESCRIPTION

       logrotate  is  designed to ease administration of systems that generate
       large numbers of log files.  It allows automatic rotation, compression,
       removal, and mailing of log files.  Each log file may be handled daily,
       weekly, monthly, or when it grows too large.

       Normally, logrotate is run as a daily cron job.  It will not  modify  a
       log  multiple  times  in  one  day unless the criterium for that log is
       based on the log’s size and logrotate is being run multiple times  each
       day, or unless the -f or -force option is used.

       Any number of config files may be given on the command line. Later con-
       fig files may override the options given in earlier files, so the order
       in  which  the logrotate config files are listed in is important.  Nor-
       mally, a single config file which includes any other config files which
       are  needed  should  be used.  See below for more information on how to
       use the include directive to accomplish this.  If a directory is  given
       on  the  command line, every file in that directory is used as a config
       file.

       If no command line arguments are given, logrotate  will  print  version
       and  copyright  information,  along with a short usage summary.  If any
       errors occur while rotating logs, logrotate  will  exit  with  non-zero
       status.

描述:

       为了简化对产生大量日志文件的各种系统的管理,logrotate从而被设计出来。它可以
       自动转储、压缩、删除和邮件这些日志。每个日志文件可以在每天,每星期,每月或太
       大了的时候被处理。

       通常,logrotate是一个每天执行一次的cron任务。除非被操作的日志文件是以大小处理
       的,并且在一天内logrotate被执行多次,或是使用了选项-f-force,每天logrotate
       不会多次修改一个文件。

       命令行可以包含任意数量的配置文件。后面的配置文件可能会覆盖前面的配置文件给出的
       选项,所以logrotate列出的配置文件顺序是很重要的。通常,如果需要包含其它配置文
       件信息,那么应该用一个单一的配置文件。根据下面更多的信息,通过使用include导向
       来完成这个。假如命令行上给出的是个目录,那么在这个目录下的文件都被看作是一个配
       置文件。

       如果命令行不包含任意选项,那么logrotate会打印出它的版本和版权信息,以及一段短
       小的用法摘要。

OPTIONS

       -v     Turn on verbose mode.


       -d     Turns  on  debug mode and implies -v.  In debug mode, no changes
              will be made to the logs or to the logrotate state file.


       -f, --force
              Tells logrotate to force the rotation, even if it doesn’t  think
              this  is  necessary.   Sometimes this is useful after adding new
              entries to logrotate, or if old log files have been  removed  by
              hand,  as  the  new files will be created, and logging will con-
              tinue correctly.


       -m, --mail 
              Tells logrotate which command to use  when  mailing  logs.  This
              command  should accept two arguments: 1) the subject of the mes-
              sage, and 2) the recipient. The command must then read a message
              on standard input and mail it to the recipient. The default mail
              command is /bin/mail -s.


       -s, --state 
              Tells logrotate to use an alternate state file.  This is  useful
              if  logrotate  is being run as a different user for various sets
              of log files.  The default state file is /var/lib/logrotate/sta-
              tus.


       --usage
              Prints a short usage message.

选项:

       -v     打开冗长模式。

       -d     打开调试模式,并且隐式打开冗长模式-v。在调试模式下,日志文件和log-
            rotate状态文件不会有变化。

        -f, --force
            告诉logrotate强制轮调,即使它不认为这是必要的。有时这是很有用的,
              譬如logrotate增加了新的入口;又如假设旧的日志文件被手动删除了,这
              样新的日志文件需要创建出来,保证正常写日志。

       -m, --mail 
            告诉logrotate当邮件日志时调用command。这个command需要包含2个参数:
              1) 消息的主题,和 2) 接收者。这个command必须从标准输入上读出消息,然
              后发邮件给接收者。默认发邮件命令是/bin/mail -s-s, --state 
            告诉logrotate使用备用的状态文件。当另一个用户正在用logrotate管理大
              量的日志文件时,这是非常有用的。默认的状态文件是/var/lib/logrotate
            /status--usage
            打印简要的用法信息。

CONFIGURATION FILE

       logrotate  reads  everything  about the log files it should be handling
       from the series of configuration files specified on the  command  line.
       Each configuration file can set global options (local definitions over-
       ride global ones, and later  definitions  override  earlier  ones)  and
       specify  a  logfile  to  rotate. A simple configuration file looks like
       this:

       # sample logrotate configuration file
       compress

       /var/log/messages {
           rotate 5
           weekly
           postrotate
                                     /sbin/killall -HUP syslogd
           endscript
       }

       "/var/log/httpd/access.log" /var/log/httpd/error.log {
           rotate 5
           mail www@my.org
           size=100k
           sharedscripts
           postrotate
                                     /sbin/killall -HUP httpd
           endscript
       }

       /var/log/news/news.crit {
           monthly
           rotate 2
           olddir /var/log/news/old
           missingok
           postrotate
                                     kill -HUP ‘cat /var/run/inn.pid‘
           endscript
           nocompress
       }

       The first few lines set global options; in the example, logs  are  com-
       pressed after they are rotated.  Note that comments may appear anywhere
       in the config file as long as the first non-whitespace character on the
       line is a #.

       The next section of the config files defined how to handle the log file
       /var/log/messages. The log will go through five weekly rotations before
       being  removed. After the log file has been rotated (but before the old
       version of the log has been compressed), the command /sbin/killall -HUP
       syslogd will be executed.

       The     next     section    defines    the    parameters    for    both
       /var/log/httpd/access.log  and  /var/log/httpd/error.log.    They   are
       rotated whenever is grows over 100k is size, and the old logs files are
       mailed (uncompressed) to www@my.org after going  through  5  rotations,
       rather  then being removed. The sharedscripts means that the postrotate
       script will only be run once(after the old logs have been  compressed),
       not  once  for  each  log which is rotated. Note that the double quotes
       around the first filename at  the  beginning  of  this  section  allows
       logrotate  to rotate logs with spaces in the name. Normal shell quoting
       rules apply, with ’, ", and \ characters supported.

       The last section defines  the  parameters  for  all  of  the  files  in
       /var/log/news.  Each  file is rotated on a monthly basis.  This is con-
       sidered a single rotation directive and if errors occur for  more  then
       one file, the log files are not compressed.

       Please  use  wildcards  with caution.  If you specify *, logrotate will
       rotate all files, including previously rotated ones.  A way around this
       is  to  use  the  olddir  directive  or  a more exact wildcard (such as
       *.log).

       Here is more information on the directives which may be included  in  a
       logrotate configuration file:


       compress
              Old  versions  of log files are compressed with gzip by default.
              See also nocompress.


       compresscmd
              Specifies which command to  use  to  compress  log  files.   The
              default is gzip.  See also compress.


       uncompresscmd
              Specifies  which  command  to  use to uncompress log files.  The
              default is gunzip.


       compressext
              Specifies which extension to use on compressed logfiles, if com-
              pression is enabled.  The default follows that of the configured
              compression command.


       compressoptions
              Command line options may be passed to the  compression  program,
              if  one is in use.  The default, for gzip, is "-9" (maximum com-
              pression).


       copy   Make a copy of the log file, but don’t change  the  original  at
              all.   This option can be used, for instance, to make a snapshot
              of the current log file, or when some  other  utility  needs  to
              truncate or pare the file.  When this option is used, the create
              option will have no effect, as the old log file stays in  place.


       copytruncate
              Truncate  the  original log file in place after creating a copy,
              instead of moving the old log file and optionally creating a new
              one,  It  can be used when some program can not be told to close
              its logfile and thus might continue writing (appending)  to  the
              previous log file forever.  Note that there is a very small time
              slice between copying the file and truncating it, so  some  log-
              ging  data  might be lost.  When this option is used, the create
              option will have no effect, as the old log file stays in  place.


       create mode owner group
              Immediately after rotation (before the postrotate script is run)
              the log file is created (with the same name as the log file just
              rotated).   mode  specifies  the  mode for the log file in octal
              (the same as chmod(2)), owner specifies the user name  who  will
              own  the  log  file,  and group specifies the group the log file
              will belong to. Any of the log file attributes may  be  omitted,
              in  which  case  those  attributes for the new file will use the
              same values as the original log file for the omitted attributes.
              This option can be disabled using the nocreate option.


       daily  Log files are rotated every day.


       delaycompress
              Postpone  compression of the previous log file to the next rota-
              tion cycle.  This has only effect when used in combination  with
              compress.   It  can be used when some program can not be told to
              close its logfile and thus might continue writing to the  previ-
              ous log file for some time.


       extension ext
              Log  files  are given the final extension ext after rotation. If
              compression is used, the compression  extension  (normally  .gz)
              appears after ext.


       ifempty
              Rotate  the  log  file  even  if  it  is  empty,  overiding  the
              notifempty option (ifempty is the default).


       include file_or_directory
              Reads the file given as an argument as if it was included inline
              where  the  include  directive appears. If a directory is given,
              most of the files in that directory are read in alphabetic order
              before  processing  of  the  including  file continues. The only
              files which are ignored are files which are  not  regular  files
              (such  as directories and named pipes) and files whose names end
              with one of the taboo extensions, as specified by  the  tabooext
              directive.  The include directive may not appear inside of a log
              file definition.


       mail address
              When a log is rotated out-of-existence, it is mailed to address.
              If  no  mail should be generated by a particular log, the nomail
              directive may be used.


       mailfirst
              When using the mail command, mail the just-rotated file, instead
              of the about-to-expire file.


       maillast
              When  using  the  mail  command,  mail the about-to-expire file,
              instead of the just-rotated file (this is the default).


       missingok
              If the log file is missing, go on to the next one without  issu-
              ing an error message. See also nomissingok.


       monthly
              Log files are rotated the first time logrotate is run in a month
              (this is normally on the first day of the month).


       nocompress
              Old versions of log files are not compressed with gzip. See also
              compress.


       nocopy Do  not copy the original log file and leave it in place.  (this
              overrides the copy option).


       nocopytruncate
              Do not truncate the original log file in place after creating  a
              copy (this overrides the copytruncate option).


       nocreate
              New  log  files  are  not  created  (this  overrides  the create
              option).


       nodelaycompress
              Do not postpone compression of the previous log file to the next
              rotation cycle (this overrides the delaycompress option).


       nomail Don’t mail old log files to any address.


       nomissingok
              If  a  log  file  does  not  exist,  issue an error. This is the
              default.


       noolddir
              Logs are rotated in the same directory the log normally  resides
              in (this overrides the olddir option).


       nosharedscripts
              Run  prerotate  and postrotate scripts for every script which is
              rotated (this is the default, and  overrides  the  sharedscripts
              option).


       notifempty
              Do not rotate the log if it is empty (this overrides the ifempty
              option).


       olddir directory
              Logs are moved into directory for rotation. The  directory  must
              be  on  the  same physical device as the log file being rotated,
              and is assumed to be relative to the directory holding  the  log
              file unless an absolute path name is specified. When this option
              is used all old versions of the log end up in  directory.   This
              option may be overriden by the noolddir option.


       postrotate/endscript
              The  lines  between postrotate and endscript (both of which must
              appear on lines by themselves) are executed after the  log  file
              is  rotated.  These  directives  may only appear inside of a log
              file definition.  See prerotate as well.


       prerotate/endscript
              The lines between prerotate and endscript (both  of  which  must
              appear  on lines by themselves) are executed before the log file
              is rotated and only if the log will actually be  rotated.  These
              directives may only appear inside of a log file definition.  See
              postrotate as well.


       firstaction/endscript
              The lines between firstaction and endscript (both of which  must
              appear  on lines by themselves) are executed once before all log
              files that match the wildcarded pattern are rotated, before pre-
              rotate  script is run and only if at least one log will actually
              be rotated. These directives may only appear  inside  of  a  log
              file definition. See lastaction as well.


       lastaction/endscript
              The  lines  between lastaction and endscript (both of which must
              appear on lines by themselves) are executed once after  all  log
              files  that  match  the  wildcarded  pattern  are rotated, after
              postrotate script is run  and  only  if  at  least  one  log  is
              rotated.  These  directives may only appear inside of a log file
              definition. See lastaction as well.


       rotate count
              Log files are rotated   times  before  being  removed  or
              mailed to the address specified in a mail directive. If count is
              0, old versions are removed rather then rotated.


       size size
              Log files are rotated when they grow bigger then size bytes.  If
              size  is  followed by M, the size if assumed to be in megabytes.
              If the k is used, the size is in kilobytes. So  size  100,  size
              100k, and size 100M are all valid.


       sharedscripts
              Normally,  prescript and postscript scripts are run for each log
              which is rotated, meaning that a single script may be run multi-
              ple  times for log file entries which match multiple files (such
              as the /var/log/news/* example). If sharedscript  is  specified,
              the scripts are only run once, no matter how many logs match the
              wildcarded pattern.  However, if none of the logs in the pattern
              require  rotating,  the  scripts  will  not  be run at all. This
              option overrides the nosharedscripts option and  implies  create
              option.


       start count
              This is the number to use as the base for rotation. For example,
              if you specify 0, the logs will be created with a  .0  extension
              as they are rotated from the original log files.  If you specify
              9, log files will be created with a  .9,  skipping  0-8.   Files
              will  still  be  rotated  the number of times specified with the
              count directive.


       tabooext [+] list
              The current taboo extension list is  changed  (see  the  include
              directive  for information on the taboo extensions). If a + pre-
              cedes the list of extensions, the current taboo  extension  list
              is  augmented,  otherwise  it is replaced. At startup, the taboo
              extension list contains .rpmorig, .rpmsave, ,v,  .swp,  .rpmnew,
              and ~.


       weekly Log  files  are  rotated if the current weekday is less then the
              weekday of the last rotation or if more then a week  has  passed
              since  the  last rotation. This is normally the same as rotating
              logs on the first day of the week, but it works better if logro-
              tate is not run every night.



FILES

       /var/lib/logrotate.status  Default state file.
       /etc/logrotate.conf        Configuration options.


SEE ALSO

       gzip(1)


AUTHORS

       Erik Troan <ewt@redhat.com>
       Preston Brown <pbrown@redhat.com>



4th Berkeley Distribution       Wed Nov 5 2002                    LOGROTATE(8)

以上是linux man手册上的logrotate。

系统管理员可以使用logrotate 程序用来管理系统中的最新的事件。logrotate 还可以用来备份日志文件,本篇将通过以下几部分来介绍

日志文件的管理:

1、logrotate 配置

2、缺省配置 logrotate

3、使用include 选项读取其他配置文件

4、使用include 选项覆盖缺省配置

5、为指定的文件配置转储参数

一、logrotate 配置

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。

logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。

logrotate 的配置文件是 /etc/logrotate.conf。主要参数如下表:

参数 功能

compress 通过gzip 压缩转储以后的日志

nocompress 不需要压缩时,用这个参数

copytruncate 用于还在打开中的日志文件,把当前日志备份并截断

nocopytruncate 备份日志文件但是不截断

create mode owner group 转储文件,使用指定的文件模式创建新的日志文件

nocreate 不建立新的日志文件

delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩

nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。

errors address 专储时的错误信息发送到指定的Email 地址

ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。

notifempty 如果是空文件的话,不转储

mail address 把转储的日志文件发送到指定的E-mail 地址

nomail 转储时不发送日志文件

olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统

noolddir 转储后的日志文件和当前日志文件放在同一个目录下

prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行

postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行

daily 指定转储周期为每天

weekly 指定转储周期为每周

monthly 指定转储周期为每月

rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份

tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~

size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).

二、缺省配置 logrotate

logrotate 缺省的配置募??/etc/logrotate.conf。

Red Hat Linux 缺省安装的文件内容是:

# see “man logrotate” for details

# rotate log files weekly

weekly

# keep 4 weeks worth of backlogs

rotate 4

# send errors to root

errors root

# create new (empty) log files after rotating old ones

create

# uncomment this if you want your log files compressed

#compress

1

# RPM packages drop log rotation information into this directory

include /etc/logrotate.d

# no packages own lastlog or wtmp –we’ll rotate them here

/var/log/wtmp {

monthly

create 0664 root utmp

rotate 1

}

/var/log/lastlog {

monthly

rotate 1

}

# system-specific logs may be configured here

缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面12行。

第三行weekly 指定所有的日志文件每周转储一次。

第五行 rotate 4 指定转储文件的保留 4份。

第七行 errors root 指定错误信息发送给root。

第九行create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和

原来的文件一样的权限。

第11行 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。

三、使用include 选项读取其他配置文件

include 选项允许系统管理员把分散到几个文件的转储信息,集中到一个

主要的配置文件。当 logrotate 从logrotate.conf 读到include 选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。

第13行 include /etc/logrotate.d 告诉 logrotate 读入存放在/etc/logrotate.d 目录中的日志转储参数,当系统中安装了RPM 软件包时,使用include 选项十分有用。RPM 软件包的日志转储参数一般存放在/etc/logrotate.d 目录。

include 选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d 。

典型的应用有:apache, linuxconf, samba, cron 以及syslog。

这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了。

四、使用include 选项覆盖缺省配置

当 /etc/logrotate.conf 读入文件时,include 指定的文件中的转储参数将覆盖缺省的参数,如下例:

# linuxconf 的参数

/var/log/htmlaccess.log

{ errors jim

notifempty

nocompress

weekly

prerotate

/usr/bin/chattr -a /var/log/htmlaccess.log

endscript

postrotate

/usr/bin/chattr +a /var/log/htmlaccess.log

endscript

}

/var/log/netconf.log

{ nocompress

monthly

}

在这个例子中,当 /etc/logrotate.d/linuxconf 文件被读入时,下面的参数将覆盖/etc/logrotate.conf中缺省的参数。

Notifempty

errors jim

五、为指定的文件配置转储参数

经常需要为指定文件配置参数,一个常见的例子就是每月转储/var/log/wtmp。为特定文件而使用的参数格式是:

# 注释

/full/path/to/file

{

option(s)

}

下面的例子就是每月转储 /var/log/wtmp 一次:

#Use logrotate to rotate wtmp

/var/log/wtmp

{

monthly

rotate 1

}

六、其他需要注意的问题

1、尽管花括号的开头可以和其他文本放在同一行上,但是结尾的花括号必须单独成行。

2、使用 prerotate 和 postrotate 选项

下面的例子是典型的脚本 /etc/logrotate.d/syslog,这个脚本只是对

/var/log/messages 有效。

/var/log/messages

{

prerotate

/usr/bin/chattr -a /var/log/messages

endscript

postrotate

/usr/bin/kill -HUP syslogd

/usr/bin/chattr +a /var/log/messages

endscript

}

第一行指定脚本对 /var/log messages 有效

花ê哦阅诓康慕疟驹诵杏? /var/log/messages

prerotate 命令指定转储以前的动作/usr/bin/chattr -a 去掉/var/log/messages文件的“只追加”属性 endscript 结束 prerotate 部分的脚本postrotate 指定转储后的动作

/usr/bin/killall -HUP syslogd

用来重新初始化系统日志守护程序 syslogd

/usr/bin/chattr +a /var/log/messages

重新为 /var/log/messages 文件指定“只追加”属性,这样防治程序员或用户覆盖此文件。

最后的 endscript 用于结束 postrotate 部分的脚本

3、logrotate 的运行分为三步:

判断系统的日志文件,建立转储计划以及参数,通过cron daemon 运行下面的代码是 Red Hat Linux 缺省的crontab 来每天运行logrotate

#/etc/cron.daily/logrotate

#! /bin/sh

/usr/sbin/logrotate /etc/logrotate.conf

4、/var/log/messages 不能产生的原因:

这种情况很少见,但是如果你把/etc/services 中的 514/UDP 端口关掉的话,这个文件就不能产生了。

以上是网上的一篇中文说明。

个人觉得比较有用的一个例子:
/etc/logrotate.d/xxx
/home/zhoudh/test/yyy {
rotate 2
size 100
copytruncate
compress
delaycompress
}

Linux/Unix:通过linux find 命令查找特定用户或用户组的文件

2016年12月8日 评论已被关闭

Linux/Unix:通过linux find 命令查找特定用户或用户组的文件

http://www.osetc.com/archives/606.html

在linux或类unix操作系统里,如何来查找特定用户组或用户创建的文件呢?我们可以使用强大的 linux find 命令来查找文件。这个命令里有参数可以用来查找特定用户或用户组的文件。

通过用户组查找文件

使用下面的方法:

find 目录 -group {用户组} -name {文件名}

其中,

目录:指定要查找的目录
用户组:根据指定的用户组来查找文件
文件名:查找该模式的文件名
示例:

1.查找所有在根目录下的属于”apache”用户组的文件:

1
#find / -group apache
命令输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@devops ~]# find / -group apache |less
/usr/share/bugzilla
/usr/share/bugzilla/report.cgi
/usr/share/bugzilla/search_plugin.cgi
/usr/share/bugzilla/buglist.cgi
/usr/share/bugzilla/testserver.pl
/usr/share/bugzilla/sanitycheck.pl
/usr/share/bugzilla/runtests.pl
/usr/share/bugzilla/skins
/usr/share/bugzilla/skins/contrib
/usr/share/bugzilla/skins/contrib/Dusk
/usr/share/bugzilla/skins/contrib/Dusk/index.css
/usr/share/bugzilla/skins/contrib/Dusk/index
/usr/share/bugzilla/skins/contrib/Dusk/index/search.gif
2. 查找根目录下的所有属于“apache”用户组并且包含”*.css”的文件

1
# find / -group apache -name “*.css”
命令输出:

1
2
3
4
5
6
7
8
9
10
[root@devops ~]# find / -group apache -name “*.css” |less
/usr/share/bugzilla/skins/contrib/Dusk/index.css
/usr/share/bugzilla/skins/contrib/Dusk/global.css
/usr/share/bugzilla/skins/contrib/Dusk/buglist.css
/usr/share/bugzilla/skins/standard/yui/calendar.css
/usr/share/bugzilla/skins/standard/duplicates.css
/usr/share/bugzilla/skins/standard/admin.css
/usr/share/bugzilla/skins/standard/params.css
/usr/share/bugzilla/skins/standard/index.css
/usr/share/bugzilla/skins/standard/create_attachment.css
如果想忽略大小来查找,可以使用下面的命令:

1
#find / -group apache -iname “*.css”
通过用户来查找文件

用法如下:
find 目录 -user {用户名} -name {文件名}

其中,

目录:指定要通过find命令查找的目录
用户名:根据提供的用户来查找文件
文件名: 指定要查找的文件模式
示例:

1.查找根目录下所有的由“root”用户创建的文件

1
#find / -user root
命令输出:

1
2
3
4
5
6
7
8
9
10
11
[root@devops ~]# find / -user root | more
/
/tmp
/tmp/.ICE-unix
/tmp/yum_save_tx-2014-04-18-09-587aonle.yumtx
/tmp/install.log
/tmp/test
/tmp/test/t7
/tmp/test/t2
/tmp/test/t10
/tmp/test/t1
2.查找根目录下所有的属于root用户并且包含”*.css”的文件名

1
#find / -user root -name “*.css”
命令输出:

1
2
3
4
5
6
[root@devops ~]# find / -user root -name “*.css”| more
/usr/share/bugzilla/skins/contrib/Dusk/index.css
/usr/share/bugzilla/skins/contrib/Dusk/global.css
/usr/share/bugzilla/skins/contrib/Dusk/buglist.css
/usr/share/bugzilla/skins/standard/yui/calendar.css
/usr/share/bugzilla/skins/standard/duplicates.css
更多参考:
1.1.其它关于Linux find 命令的用法
2. find man帮助

分类: Linux命令大全 标签: