4find 的选项 -print0
打印文件名到标准输出且以null字符结尾,从而保证包含newlines或其他的空格的文件名能够被接下来处理find输出的程序正确的理解。此选项与xargs的-0对应。
对于Linux的中的一些问题,一般地我们可以通过以下的思路来解决:
1)使用Linux提供的很多的小工具和管道来处理;
2)如果需要使用多条命令,或需要逻辑判断,考虑使用sh,sh除了能直接使用Linux的小工具外,还可以进行很多的逻辑和流程控制;
3)如果需要很多的字符串处理,问题也比较复杂,考虑使用perl,在perl中可以方便地调用Linux的小工具,但是又不缺强大的字符串处理能力;
4)最后如果可以称的上是一个小的项目的问题,使用python,python与高级语言更加相似,更易于阅读和维护;
例如对于问题:修改一个目录和子目录下的所有的*.log为*.LOG
1) 使用Linux的小命令
查找到所有的*.log文件:find . -iname '*.log' -type f -print
替换得到新的文件名:echo $filename | sed s/\.log$/\.LOG/i
修改文件的名字:mv $oldname $newname
2) 转化为sh脚本(csh)
#!/bin/csh -x
cd $1
set files = `find . -iname '*.log' -type f -print`
foreach f ($files)
if ( $f !~ "*.LOG") then
set newf = `echo $f | sed s/\.log\$/\.LOG/i`
mv $f $newf
endif
end
3) 牛逼作法
使用使用一条命令加sh的while来实现:
find . -iname '*.log' -type f -print | while read fname; do echo mv $fname ${fname/.log/.LOG/}; done | bash -x
例如获取所有包含python的进程的命令行
多的所有进程的详细列表: ps -ef
使用grep查找包含的行且去除grep进程本身: grep -v grep | grep python
1) 使用cut
ps -ef | cut -f8
上面的命令不能正常的工作,因为cut默认是以TAB来分隔多个列的,但是ps的输出是以多个空格分隔的,并不是以TAB来分隔的,所以需要使用tr来将多个空格压缩为一个空格,
ps -ef | tr -s ' ' | cut -d' ' -f 8- | grep -v grep | grep python
2) 使用awk
ps -ef | awk '{print$8,$NF}' | grep -v grep | grep python
awk默认的列分隔符为一个或多个空格或TAB,当然你可以通过FS来修改列分隔符,记录行间的分隔符为RS。例如 BEGIN {FS="[[:space:]+]"}貌似linux的ls没有参数可以只显示子目录
ls -l ./ | grep ^d | awk '{print$9}'
将子目录下的所有的output文件拷贝到一个新的目录,子目录结构仍然保持
cd olddir
ls -l ./ | grep ^d | awk '{print$9}' | xargs -I '{}' cp '{}'/output /newdir/'{}'/ouput
类似地执行子目录下的所有的run.sh
ls -l ./ | grep ^d | awk '{print$9}' | xargs -I '{}' '{}'/run.sh &
我们知道cp -s 可以将文件拷贝为软连接,但是如果想把目录直接拷贝为软连接貌似不行。
将源路径$src下的所有子目录和文件在新的目录$tgt下创建连接:ls $src | xargs -t -I '{}' ln -s $src/'{}' $tgt/'{}'
如果目标目录下存在相同的子目录,则子目录下的文件不能拷贝成功。需要使用方法二
假设dir1和dir2下都有子目录aaa,但是aaa下的文件不同。
cp -rf dir1 dir
查找文件
常 用 命 令 简要中文说明 程序所在目录
more 分页显示一个文件或任何输出结果 /bin
less 分页显示一个文件并且可以回头 /usr/bin
whereis 寻找文件工具 /usr/bin
Which 寻找文件工具 /usr/bin
find 寻找文件工具 /usr/bin
locate 寻找文件工具 /usr/bin
一 more [文件名] 分页显示一个文件或任何输出结果
其实more不是用来寻找文件的,但是一般人却十有八九是在找文件时把它派上用场。
因为 more 主要的作用是把输出结果显示在屏幕上,一页停止一次,所以例如当我们用 ls 命令去找一个 x字母开头的文件,而下达了 ls x* 却仍然列出太多文件,一个屏幕看不完时,就可以配合管道符号和 more 命令:
ls x* | more
它会一屏停止一下,等待您按空白键才继续往上卷。于是 more 俨然犹如 DOS 的 DIR 命令 /P 选项的地位了。而 more 当主角的时候,是用做一页一次显示文章,例如我们想要看 /etc 里面的 XF86Config 文件,可以下如下命令:
more /etc/XF86Config
这样,我们就可以不断按空白键把这个文件慢慢看完。但是,因为more 先天的设计,如果您看完了这页,想要回头看上一页,很抱歉,是不行的,您必须从头再来!
二 less [文件名] 分页显示一个文件并且可以回头
less命令很好笑,取名时就故意与more 命令打对台,你叫“更多”,我就叫“更少”,就好像你叫黑人牙膏我就叫白人牙膏一样。事实上与什么“更多”、“更少”都没有关系。它最主要只是为了改进一点:more 不能回头看的问题!
less 的优点就是可以随时回头,最简单的用【PgUp】键就可以向上翻。
可是依我们的孤陋之见,还是用文书编辑器去阅读文件就好了嘛,更何况 less 本身还有高达 42 个选项,何必那么麻烦!
所以,为了您好,选项我们也不介绍了。这个命令目前只在 Linux 系统可以使用,其他 UNIX 家族尚无。
三 whereis 文件名 寻找文件工具
whereis 是一个小巧好用的文件寻找工具,它专门用来寻找可执行的程序、原始程序和使用手册。
例如执行命令:
whereis bzip2
它就会告诉您,bzip2 放在 /usr/bin 。通常,如果您确定某个东西是程序,而用 whereis 找不到的话,那就表示本系统没有安装该程序了,例如:
whereis cjoe
表示这套系统中没有装 cjoe,否则应该会找到才对。
四 which 文件名 寻找文件工具
which显示某一指定的文件位于何处。基本同whereis。
五 find [寻找的目录] [表示式] 寻找文件工具
find 是高级的寻找文件工具,可不像 whereis 那么“阳春白雪”。但也因为它太高级了,复杂到很多人用不熟练。我们尽量只举简单的例子。
1、find命令的一般形式为;
find pathname -options [-print -exec -ok ...]
2、find命令的参数;
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。[如果结果包含很多的文件,使用xargs代替exec]
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
3、find命令选项
-name
按照文件名查找文件。
-perm
按照文件权限来查找文件。
-prune
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user
按照文件属主来查找文件。
-group
按照文件所属的组来查找文件。
-mtime -n +n
按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
-nogroup
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2
查找更改时间比文件file1新但比文件file2旧的文件。
-type
查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
另外,下面三个的区别:
-amin n 查找系统中最后N分钟访问的文件
-atime n 查找系统中最后n*24小时访问的文件
-cmin n 查找系统中最后N分钟被改变文件状态的文件
-ctime n 查找系统中最后n*24小时被改变文件状态的文件
-mmin n 查找系统中最后N分钟被改变文件数据的文件
-mtime n 查找系统中最后n*24小时被改变文件数据的文件
4、find命令实例:
find /usr -atime 3 –print
会从 /usr 目录开始往下找,找最近3天之内存取过的文件。
find /usr -ctime 5 –print
会从 /usr 目录开始往下找,找最近5天之内修改过的文件。
find /doc -user jacky -name 'j*' –print
会从 /doc 目录开始往下找,找jacky 的、文件名开头是 j的文件。
find /doc \( -name 'ja*' -o- -name 'ma*' \) –print
会从 /doc 目录开始往下找,找寻文件名是 ja 开头或者 ma开头的文件。
find /doc -name '*bak' -exec rm {} \;
会从 /doc 目录开始往下找,找到凡是文件名结尾为 bak的文件,把它删除掉。-exec 选项是执行的意思,rm 是删除命令,{ } 表示文件名,“\;”是规定的命令结尾。
find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件
六 locate 文件名 寻找文件工具
locate 也是一个寻找文件的工具,但是它不像 whereis 只能找程序文件等几种文件,也不像find那么复杂,可以算是“中庸之道”!
中庸之道,往往就是大部分人最佳的选择,whereis找不到的文件,find要一大串命令,还花了很久的时间才找到的XF86Config设置文件,而用locate一下子就简单找到了!
一 cron
crond位于/etc/rc.d/init.d/crond 或 /etc/init.d 或 /etc/rc.d /rc5.d/S90crond,最总引用/var/lock/subsys/crond。
cron是一个linux下的定时执行工具(相当于windows下的scheduled task),可以在无需人工干预的情况下定时地运行任务task。由于cron 是Linux的service(deamon),可以用以下的方法启动、关闭这个服务:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service crond start
现在cron这个服务已经在进程里面了,我们就可以用这个服务了。
二 crontab
crontab位于/usr/bin/crontab。
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e 进入vi编辑模式,编辑的内容一定要符合下面的格式:
*/1 * * * * ls >> /tmp/ls.txt
这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:
分钟 (0-59)
小時 (0-23)
日期 (1-31)
月份 (1-12)
星期 (0-6)//0代表星期天
除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"*/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。以下举几个例子说明问题:
每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line
1月1日早上4点
0 4 1 1 * command line
每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。
三 编辑/etc/crontab配置文件
cron的系统级配置文件位于/etc/crontab。
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab配置文件,因此我们配置这个文件也能运用 cron服务做一些事情。用crontab -e进行的配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本
大家注意"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。
四 实例
--------------------------------------
基本格式 : [参数间必须使用空格隔开]
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启lighttpd 。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启lighttpd 。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启lighttpd 。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启lighttpd
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启lighttpd
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启lighttpd
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启lighttpd
五 特殊用法