find与xargs小陷阱

find与xargs

1 find命令格式与基本参数
find命令基本格式为: find pathname -options [-print -exec -ok]
具体参数如下:
pathname:查找路径
-name:按照文档名称查找
-perm:按照文档权限查找
-prune:不在当前指定的路径查找。假如同时指定了-depth选项,则prune被忽略
-user:按照文档属主查找
-group:按照文档属组查找
-mtime -n +n:按照文档更改时间查找。-n 指距离现在时间n天以内;+n n天以外
-nogroup:查找无效属组文档
-nouser:查找无效属主文档
-newer file1 !file2:查找更改时间比file1新比file2旧的文档
-type:查找某一类型文档
b:块设备文档
d:目录
c:字符设备文档
P:管道文档
l:符号链接文档
f:普通文档
-size n[c]查找文档长度为n块的文档 有[c]表示文档长度以字节计
-depth:查找时,首先查找当前目录文档,然后再在其子目录查找
-fstype:查找位于某一类型文档系统中的文档,文档系统类型可在/etc/fstab中找到
-mount:查找文档不跨越文档系统mount点
-follow:如碰到链接文档,则跟踪至链接所指向文档
-cpio:对匹配的文档使用cpio命令,将文档备份到磁带设备中 
-print:将匹配的文档输出到标准输出
-exec:对匹配的文档执行所给的shell命令。形式为:command { } \;注意{ }和\;之间的空格
-ok:和-exec作用相同。只但是以一种更安全的模式执行该参数所给的shell命令。在执行每个命令之前,都会给出提示,让用户确定是否执行
以上命令参数不必要都掌握,只需掌握比较实用的,其他的用到时再查询也比较方便。
2 find命令实用场景举例
find / -name "[a-z]*" // 在根目录及其子目录下查找文件名以小写字母开头的文件,注意此处并不是正则表达式。
find ./ -user barry // 在当前目录下查找文件属主是barry的文件
find /barry -type d // 在barry目录下查找类型是目录的文件
find /barry -mtime +5 // 在barry目录下查找文件最后更新时间在5天以前的文件
find /barry -ctime -3 // 查找最后更新时间在3天以内的文件,注意此处是文件属性的更新时间,不是文件内容
find /barry -size +5k //查找文件大小在5k以上的文件
以上查找条件可以同时使用,用来查找同时满足多个条件的文件。
find ./ -type f -exec rm {} \; // 对于查找到的符合条件的文件执行rm命令,注意{}与\之间的空格
但是这样会有个问题,当查找到的文件非常多时,对每一个文件都执行rm命令,产生多个进程,资源消耗比较厉害。所以xargs就显得很聪明了,它并不产生多个进程。
3 xargs命令
xargs命令接收一块数据,这块数据是张参数列表,按照指定的分隔符,每个分段是一个参数。例如:
find ./ -type f | xargs rm
这样就对找到的每个文件执行rm命令,类似-exec的功能。
不过,问题来了,当find找到的文件的路径中有空格时,xargs会把这个路径分成两段,每一段作为一个参数,可见默认xargs是以空格问分割依据的。
如果让xargs和find命令以别的一个特殊的字符作为分隔符,这个问题不就解决了,这样xargs就不会误会find了。
find命令可以用 -print0选项将find命令的输出以空字符‘0‘作为分隔符,也就是说路径之间是以空字符作为分隔符的。
同理,xargs命令用 -0 来指定以空字符作为分隔符,从传递进来的数据中提取参数。如下:
find ./ -type f -print0 | xargs -0 rm
这样就和谐了。

原文

http://www.cnblogs.com/barrychiao/archive/2012/10/10/2718777.html

时间: 2024-10-25 00:02:12

find与xargs小陷阱的相关文章

关于字符“\”转义的一个小陷阱

一.问题介绍 很久没有用c#去连数据库程序了,不过在网上找了一些资料,基本上还是写出来了,但是调试初步完成的程序时候,却发现在con.open()这个方法总是出错,说找不到数据库实例名称,或者远程连接失败,显示的错误是error40. 错误如下: 二.环境介绍 1.我的数据库是sqlserver2008,使用的开发环境是vs2013,.net4.0 2.我的数据库安装采用的命名实例,所以在编写数据库连接字符串的时候的服务器名称应为 [计算机名\数据实例名] 数据库连接字符为: 当发现连接错误之后

C++ string中的几个小陷阱,你掉进过吗?

C++开发的项目难免会用到STL的string,使用管理都比char数组(指针)方便的多,但在得心应手的使用过程中也要警惕几个小陷阱,避免我们项目出bug却迟迟找不到原因. 1.  结构体中的string赋值问题直接通过一个例子说明,下面的例子会输出什么: #include <iostream> #include <string> #include <stdlib.h> using namespace std; struct flowRecord { string ap

C# 中几个小“陷阱”

每天写代码,偶尔就会有让你抓狂的时候:代码改了千百遍,蓦然回首,Bug就在灯火阑珊处……这里就列举一些容易犯错的几个小地方,以后遇到了其他的,再慢慢添加.   1. 获取程序当前运行路径   情景复现:WPF客户端程序,开机自启动后无法进入主界面,卡在初始屏(Splash Screen)   处理问题:通过日志发现加载一个icon的时候,跳了一个Bug.初始代码如下: var icon = new Icon("Images\\xxx.ico"); 很简单,貌似不会有问题,相对目录且正确

java常量池中基本数据类型包装类的小陷阱

想必大部分学过java的人都应该做过这种题目: 1 public class Test { 2 public static void main(String[] args) { 3 //第一个字符串 4 String s1="hello"; 5 6 //第二个字符串 7 String s2="hello"; 8 9 //比较s1和s2是否相同 10 System.out.println(s1==s2); 11 12 13 /** 14 * 修改变量 15 */ 16

Java 集合(List、Set)遍历、判断、删除元素时的小陷阱

开发中,常有场景:遍历集合,依次判断是否符合条件,如符合条件则删除当前元素. 不知不觉中,有些陷阱,不知你有没有犯. 1. 一.漏网之鱼-for循环递增下标方式遍历集合,并删除元素 如果你用for循环递增下标方式遍历集合,在遍历过程中删除元素,你可能会遗漏了某些元素.说那么说可能也说不清楚,看以下示例: import java.util.ArrayList; import java.util.List; public class ListTest_Unwork { public static v

MyBatis使用动态SQL标签的小陷阱

现在MyBatis越来越受大家的喜爱了,它的优势大家都知道,我就不多说了,直接说重点. MyBatis中提供动态SQL功能,我们可以使用<if><when><where><otherwise><foreach>等等,这样我们就可以写出根据条件生成的动态SQL了,但是,在这中间,我们经常用到的<if>标签有一个小误区,一不小心就会掉下去,下面先举个正常的例子: <select id="findActiveBlogWith

Java小陷阱

基本数据类型与字符串的连接 在Java中,+不仅可作为加法运算符使用,还可作为字符串连接运算符使用. 当把任何基本数据类型的值与字符串值进行连接运算时,基本类型的值将自动类型转换为字符串类型. public class PrimitiveAndString { public static void main(String[] args) { //下面的语句输出 7Hello! System.out.println(3 + 4 + "Hello!"); //下面的语句输出 Hello!3

ios调用dismissViewController的一个小陷阱

我们的APP从启动到进入主页面.是通过presentViewController构造了一个ViewController序列,类似于首页 -> 登陆页 -> 启动载入页 -> 主页面 当中.在启动载入页的viewDidAppear方法里做了非常多逻辑处理: -(void) viewDidAppear:(BOOL)animated{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(

C++学习之路: STL探索之 reverse_iterator 的一个小陷阱

1 2.reverse迭代器 2 a) 在逻辑上,rbegin指向最后一个元素,rend指向第一个元素的前一个位置. 3 b) 但是在实际实现上,rbegin指向最后一个元素的下一个位置,rend指向第一个元素. 4 c) reverse迭代器的物理位置与逻辑位置差1 5 d) 逻辑值比物理位置减少了1. 引言: vector<int> vec 我们push_back是十个数   it 0  1  2  3  4  5  6  7  8  9 r_it 我们用 vector<int>