shell 编程--ch02 使用find和xargs
时间:2006-03-29 来源:alphix
ch02 使用find和xargs
内容提要
[*]find命令选项
[*]使用find命令不同选项的例子
[*]配合find使用xargs命令的例子 语法: find pathname -options [-print -exec -ok]
参数: pathname: find命令查找的目录路径. 用"."来表示当前路径,用"/"表示根目录.
-print : find命令对匹配的文件输出到标注输出
-exec : find命令对匹配的文件执行该参数所给出的shell命令.
相应的命令格式"'command' {} \;",注意"{}"和"\;"之间的空格.
-ok : 和-exec的作用相同,只不过以一种更为安全的模式来执行参数所给出的shell
命令,在执行每个命令之前,都给出提示,让用户来确定是否执行.
2.1 find命令选项
主要选项:
-name : 按照文件名查找文件
-perm : 按照文件权限来查找文件
-prune : 使用这一选项已使find命令不在当前指定的目录中查找,如果同时使用-depth选项,
那么-prune选项将被find命令忽略.
-user : 按照文件属主来查找文件
-group : 按文件所属的组来查找文件
-mtime -n +n : 按照文件更改的时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件
更改时间距现在n天以前.find命令还可有-atime和-ctime选项,但他们和-mtime选项
像是,所以我在这里只介绍-mtime选项
-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命令,将这些文件备份到磁带设备中
2.1.1 使用name选项
在自己的根目录$HOME中查找文件名符合*.txt的文件,
% find ~ -name "*.txt" -print
在当前目录中查找所有*.txt文件,
% find . -name "*.txt" -print
在当前目录及子目录中查找以一个大写开头的文件,
% find . -name "[A-Z]*" -print
在/etc目录中查找名为host开头的文件,
% find /etc -name "host*" -print
2.1.2 使用perm选项
在当前目录查找文件权限为755的文件,
% find . -perm 755 -print
如果希望在当前目录下查找所有用户都有可读、写、执行的的文件,在八进制数字前面加一个-.
% find . -perm -007 -print
2.1.3 忽略某个目录
在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
% find /apps -name "/apps/bin" -prune -o -print
2.1.4 使用user和nouser选项
在$HOME目录中查找属主为dave的文件,
% find ~ -user dave -print
在/etc目录下查找文件属主为uucp的文件
% find /etc -usr uupc -print
为了查找属主帐户已经被删除的文件,可以使用-nouser选项.这样就能够找到那些属主在/etc/passwd
文件中没有的有效帐户的文件.
% find /home -nouser -print
2.1.5 使用group和nogroup选项
用法同user和nouser.
2.1.6 按照更改时间查找
使用mtime选项.
在根目录下查找更改时间在5日内的文件,
% find / -mtime -5 -print
为了在/var/adm目录下查找在3日以前的文件
% find /var/adm -mtime +3 -print
2.1.7 查找比某个文件新或旧的文件
-newer 选项,一般形式为: newest_file_name ! oldest_file_name
查找更改时间比文件age.awk新但比文件belts.awk旧的文件:
% find . -newer age.awk ! -newer belts.awk -exec ls -l {} \;
2.1.8 使用选项type选项
查找/etc目录下的所有目录:
% find /etc -type d -print
为了在当前目录下查找除目录以外的所有类型的文件:
% find . ! -type d -print
查找/etc下所有的符号链接
% find /etc -type l -print
2.1.9 使用size选项
在当前目录下查找文件长度大于1M字节的文件:
% find . -size +1000000c -print
在/home/apache目录下查找文件长度恰好为100字节的文件:
% find /home/apache -size 100c -print
在当前目录下查找长度超过10块的文件(一块为512字节):
% find . -size +10 -print
2.1.10 使用depth选项
从文件系统的根目录开始,查找一个名为CON.FILE的文件
% find / -name "CON.FILE" -depth -print
2.1.11 使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统)
% find . -name "*.XC" -mount -print
2.1.12 使用cpio选项
使用cpio命令备份/etc、/home和/apps目录中的文件
% cd /
% find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0
2.1.13 使用exec和ok来执行shell命令
exec选项后面跟随着所要执行的命令,然后是一对{},一个空格和一个\,最后是一个分号
% find . -type f -exec ls -l {} \;
在/log目录中查找更改时间在5日以前的文件并删除他们
% find logs -type f -mtime +5 -exec rm {} \;
另一种安全的方法:
% find logs -type f -mtime +5 -ok rm {} \;
< rm ... ./nets.LOG > ? y[n] 2.2 xargs
xargs的作用是解决exec可能由于传递参数溢出和产生过多的进程使系统性能下降的问题,xargs只产生一个进程,并且每次读取一部分参数来执行命令,还可配相应的参数限制每次读取的参数长度.
查找系统中的每一个文件,然后使用xargs命令来测试它们分别属于哪类文件:
% find / -type f -print | xargs file
/etc/protocols: English text
/etc/securetty: ASCII text
...
查找整个系统中内存信息转储文件(core dump),然后把结果保存到/tmp/core.log文件中
% find . -name "core" -print | xargs echo "" > /tmp/core.log
查找/apps/audit目录下所有用户具有读写和执行权限的文件,并收回相应的写权限
% find /apps/audit -perm -7 -print | xargs chmod o-w
用grep命令在所有的普通文件中搜索device这一词
% find / -type f -print | xargs grep "device"
[*]find命令选项
[*]使用find命令不同选项的例子
[*]配合find使用xargs命令的例子 语法: find pathname -options [-print -exec -ok]
参数: pathname: find命令查找的目录路径. 用"."来表示当前路径,用"/"表示根目录.
-print : find命令对匹配的文件输出到标注输出
-exec : find命令对匹配的文件执行该参数所给出的shell命令.
相应的命令格式"'command' {} \;",注意"{}"和"\;"之间的空格.
-ok : 和-exec的作用相同,只不过以一种更为安全的模式来执行参数所给出的shell
命令,在执行每个命令之前,都给出提示,让用户来确定是否执行.
2.1 find命令选项
主要选项:
-name : 按照文件名查找文件
-perm : 按照文件权限来查找文件
-prune : 使用这一选项已使find命令不在当前指定的目录中查找,如果同时使用-depth选项,
那么-prune选项将被find命令忽略.
-user : 按照文件属主来查找文件
-group : 按文件所属的组来查找文件
-mtime -n +n : 按照文件更改的时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件
更改时间距现在n天以前.find命令还可有-atime和-ctime选项,但他们和-mtime选项
像是,所以我在这里只介绍-mtime选项
-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命令,将这些文件备份到磁带设备中
2.1.1 使用name选项
在自己的根目录$HOME中查找文件名符合*.txt的文件,
% find ~ -name "*.txt" -print
在当前目录中查找所有*.txt文件,
% find . -name "*.txt" -print
在当前目录及子目录中查找以一个大写开头的文件,
% find . -name "[A-Z]*" -print
在/etc目录中查找名为host开头的文件,
% find /etc -name "host*" -print
2.1.2 使用perm选项
在当前目录查找文件权限为755的文件,
% find . -perm 755 -print
如果希望在当前目录下查找所有用户都有可读、写、执行的的文件,在八进制数字前面加一个-.
% find . -perm -007 -print
2.1.3 忽略某个目录
在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
% find /apps -name "/apps/bin" -prune -o -print
2.1.4 使用user和nouser选项
在$HOME目录中查找属主为dave的文件,
% find ~ -user dave -print
在/etc目录下查找文件属主为uucp的文件
% find /etc -usr uupc -print
为了查找属主帐户已经被删除的文件,可以使用-nouser选项.这样就能够找到那些属主在/etc/passwd
文件中没有的有效帐户的文件.
% find /home -nouser -print
2.1.5 使用group和nogroup选项
用法同user和nouser.
2.1.6 按照更改时间查找
使用mtime选项.
在根目录下查找更改时间在5日内的文件,
% find / -mtime -5 -print
为了在/var/adm目录下查找在3日以前的文件
% find /var/adm -mtime +3 -print
2.1.7 查找比某个文件新或旧的文件
-newer 选项,一般形式为: newest_file_name ! oldest_file_name
查找更改时间比文件age.awk新但比文件belts.awk旧的文件:
% find . -newer age.awk ! -newer belts.awk -exec ls -l {} \;
2.1.8 使用选项type选项
查找/etc目录下的所有目录:
% find /etc -type d -print
为了在当前目录下查找除目录以外的所有类型的文件:
% find . ! -type d -print
查找/etc下所有的符号链接
% find /etc -type l -print
2.1.9 使用size选项
在当前目录下查找文件长度大于1M字节的文件:
% find . -size +1000000c -print
在/home/apache目录下查找文件长度恰好为100字节的文件:
% find /home/apache -size 100c -print
在当前目录下查找长度超过10块的文件(一块为512字节):
% find . -size +10 -print
2.1.10 使用depth选项
从文件系统的根目录开始,查找一个名为CON.FILE的文件
% find / -name "CON.FILE" -depth -print
2.1.11 使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统)
% find . -name "*.XC" -mount -print
2.1.12 使用cpio选项
使用cpio命令备份/etc、/home和/apps目录中的文件
% cd /
% find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0
2.1.13 使用exec和ok来执行shell命令
exec选项后面跟随着所要执行的命令,然后是一对{},一个空格和一个\,最后是一个分号
% find . -type f -exec ls -l {} \;
在/log目录中查找更改时间在5日以前的文件并删除他们
% find logs -type f -mtime +5 -exec rm {} \;
另一种安全的方法:
% find logs -type f -mtime +5 -ok rm {} \;
< rm ... ./nets.LOG > ? y[n] 2.2 xargs
xargs的作用是解决exec可能由于传递参数溢出和产生过多的进程使系统性能下降的问题,xargs只产生一个进程,并且每次读取一部分参数来执行命令,还可配相应的参数限制每次读取的参数长度.
查找系统中的每一个文件,然后使用xargs命令来测试它们分别属于哪类文件:
% find / -type f -print | xargs file
/etc/protocols: English text
/etc/securetty: ASCII text
...
查找整个系统中内存信息转储文件(core dump),然后把结果保存到/tmp/core.log文件中
% find . -name "core" -print | xargs echo "" > /tmp/core.log
查找/apps/audit目录下所有用户具有读写和执行权限的文件,并收回相应的写权限
% find /apps/audit -perm -7 -print | xargs chmod o-w
用grep命令在所有的普通文件中搜索device这一词
% find / -type f -print | xargs grep "device"
相关阅读 更多 +