您的位置:首页 > 运维架构 > Linux

linux 基础命令学习---find, sed

2010-10-23 16:31 513 查看
文本流之于Unix,犹如扭动的丝带,将Unix下的各种小工具组合在一起. 这是unix的哲学基础之一的体现:
"组合原则:设计时考虑拼接组合". 常用工具find, sed的配合使用就是这种组合的体现.
先看find 命令:
1. find 命令的一般形式为:
find pathname –options [-print –exec -ok...]
find的命令参数:

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。tf
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } /;,注意{   }和/;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

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命令,将这些文件备份到磁带设备中。


find命令的例子;


1、查找当前用户主目录下的所有文件:

下面两种方法都可以使用
$ find $HOME -print
$ find ~ -print


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

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


3、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;

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


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

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


5、为了查找系统中所有属于root组的文件;

$find . -group root -exec ls -l {  } /;
-rw-r--r--    1 root     root          595 10月 31 01:09 ./fie1


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

该命令只检查三位数字,所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ,才能使用下面这个命令
$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7  -ok
rm {  } /;
< rm ... ./admin.log001 > ? n
< rm ... ./admin.log002 > ? n
< rm ... ./admin.log042 > ? n
< rm ... ./admin.log942 > ? n


7、为了查找当前文件系统中的所有目录并排序;

$ find . -type d | sort

  需求:把本目录下,包括子目录下的文件,把所有含有“/adm/images/c.gif”的地方替换为“/Admin/Images/c.gif”。
    步骤:找出文件,找到地方,替换。
    寻找命令:找到文件(find,ls),找到地方(grep),替换(sed)。
    现在需要做的,就是组合起来。
    查找资料,有前辈告诫:“find 命令是所有 Linux 命令中最有用的一个,同时也是最混乱的一个”,顿时奔溃。
    还好,发现find命令有个叫“-exec”的,很是强大:find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} /;,注意{}和/;之间的空格。
    个人理解:-exec参数中的“{}”是该参数前命令产生的结果的占位符。
    而且还可以有多个-exec参数,很是强大。基本上grep和sed都可以作为子命令在其中运行了。
    如此一来,可以使用以下命令列出需要替换的字符串所在的行了:
以下是代码片段:
find ./ -exec grep "/adm/images/c.gif" '{}' /;
    然后再使用一个-exec参数吧sed包含进来吧。
以下是代码片段:
find ./ -exec grep "/adm/images/c.gif" '{}' /; -exec sed -i .bak 's///adm//images//c.gif///Admin//Images//c.gif/g' {} /;
8. 重命名文件:
需要备份的文件找到之后,接下去要做的就是利用cp命令把这些文件复制到其他目录中去。但是这里还需要做的一件事情是在复制过去后需要把文件进行重命名,即在原来文件的后面加上.backup,以提醒用户这些是备份文件,不能够删除或者修改。要实现这个功能的话,就需要用到文件名的占位符号。如果利用cp命令复制文件后同时批量更改文件的名字,只需要使用 cp {} {}.backup即可。这里的{}符号就是文件名的占位符号。cp {} {}.backup这个命令的功能就是先把文件复制到一个特定的目录中,然后在对复制过去的每个文件进行重命名,后面都依次加上.backup内容。
为此要实现上面文件备份的需要,只需要使用命令
find /home/oracle –mtime 1 –exec cp {} /backup/{}.backup /;即可。
执行这个命令后,系统会在用户主目录下寻找所有修改时间少于1天的文件,并把找到的文件复制到/backup目录下。并在每一个原始文件后面增加一个扩展名.backup。最后的/;是一个固定格式必须要有。然后系统工程师只需要把这个命令加入到cron中,让操作系统在每天中午或者其他空闲的时间周期性执行这个命令即可。如此的话,操作系统就会自动对用户的文件进行备份,以防止文件意外损坏或者修改所造成的损失。
另外需要注意的是,在Linux操作系统中find命令只可以找到最近一天修改的文件。而在Linux操作系统中,还有mmin参数,这个参数是以分钟为单位,如可以找到那些最近4个小时或者1个小时之内修改过的文件,从而提高备份的频率。为此系统工程师可以根据用户的需要来调整文件备份的频率。不过笔者认为,一般情况下文件备份一天一次即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息