转
尋找曾經在 10 分鐘內被存取或修改過的檔案 (判斷檔案存取時間)
find $HOME -type f -amin -10
今天一个很偶然的机会看到了linux中的find命令,然后我在网上搜索了一下这方面的内容,为了方便大家学习参考,我就总结一下,一上午的劳动成果,呵呵!
首先是find的语法:
find [起始目录] 寻找条件 操作
还有种表述方式:find PATH OPTION [-exec COMMAND { } \;]
因为find命令会根据我们给的option,也就是寻找条件从我们给出的目录开始对其中文件及其下子目录中的文件进行递归搜索,所以我觉的这个地方说是“起始目录”是非常好的。
该命令中的寻找条件可以是一个用逻辑运算符 not、and、or 组成的复合条件。逻辑运 算符 and、or、not 的含义为:
(1) and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有当所给的条 件都满足时,寻找条件才算满足。例如:
find –name ’tmp’ –xtype c -user ’inin’
% 该命令寻找三个给定条件都满足的所有文件
(2) or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足 时,寻找条件就算满足。例如:
find –name ’tmp’ –o –name ’mina*’
% 该命令查询文件名为’tmp’或是匹配’mina*’的所有文件。
(3) not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件 。例如:
find ! –name ’tmp’
% 该命令查询文件名不是’tmp’的所有文件。
需要说明的是:当使用很多的逻辑选项时,可以用括号把这些选项括起来。为了避免Shell本身对括号引起误解,在话号前需要加转义字符“\”来去除括号的意义。例:
find \(–name ’tmp’ –xtype c -user ’inin’ \)
我觉的现在我应该说下出了查询条件,在find中的option的内容了:
在option中,具体有参数:
-name ’字串’ 查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。
-lname ’字串’ 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符 *、?、[ ]。
-gid n 查找属于ID号为 n 的用户组的所有文件。
-uid n 查找属于ID号为 n 的用户的所有文件。
-group ’字串’ 查找属于用户组名为所给字串的所有的文件。
-user ’字串’ 查找属于用户名为所给字串的所有的文件。
-empty 查找大小为 0的目录或文件。
-path ’字串’ 查找路径名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。
-perm 权限 查找具有指定权限的文件和目录,权限的表示可以如711,644。
-size n[bckw] 查找指定文件大小的文件,n 后面的字符表示单位,缺省为 b,代表512字节的块。
-type x 查找类型为 x 的文件,x 为下列字符之一:
b 块设备文件
c 字符设备文件
d 目录文件
p 命名管道(FIFO)
f 普通文件
l 符号链接文件(symbolic links)
s socket文件
-xtype x 与 -type 基本相同,但只查找符号链接文件。
以时间为条件查找
-amin n 查找n分钟以前被访问过的所有文件。
-atime n 查找n天以前被访问过的所有文件。
-cmin n 查找n分钟以前文件状态被修改过的所有文件。
-ctime n 查找n天以前文件状态被修改过的所有文件。
-mmin n 查找n分钟以前文件内容被修改过的所有文件。
-mtime n 查找n天以前文件内容被修改过的所有文件。
-print:将搜索结果输出到标准输出。
例子:在root以及子目录查找不包括目录/root/bin的,greek用户的,文件类型为普通文件的,3天之前的名为test-find.c的文件,并将结构输出,find命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -print
当然在这其中,-print是一个默认选项,我们不必刻意去配置它。
我们再看一下exec选项:
-exec:对搜索的结构指令指定的shell命令。注意格式要正确:"-exec 命令 {} \;"
在}和\之间一定要有空格才行;
{}表示命令的参数即为所找到的文件;命令的末尾必须以“ \;”结束。
例子:对上述例子搜索出来的文件进行删除操作,命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -exec rm {} \;
find命令指令实例:
find . - name ‘main*’ - exec more {} \;
% 查找当前目录中所有以main开头的文件,并显示这些文件的内容。
find . \(- name a.out - o - name ‘*.o’\)> - atime +7 - exec rm {} \;
% 删除当前目录下所有一周之内没有被访问过的a .out或*.o文件。
% 命令中的“.”表示当前目录,此时 find 将从当前目录开始,逐个在其子目录中查找满足后面指定条件的文件。
% “\(” 和 “\)” 表示括号(),其中的 “\” 称为转义符。之所以这样写是由于对 Shell 而言,(和)另有不同的含义,而不是这里的用于组合条件的用途。
% “-name a.out” 是指要查找名为a.out的文件;
% “-name ‘*.o’” 是指要查找所有名字以 .o 结尾的文件。
这两个 -name 之间的 -o 表示逻辑或(or),即查找名字为a.out或名字以 .o结尾的文件。
% find命令在当前目录及其子目录下找到这佯的文件之后,再进行判断,看其最后访问时间 是否在7天以前(条件 -atime +7),若是,则对该文件执行命令 rm(-exec rm {} \;)。
其中 {} 代表当前查到的符合条件的文件名,\;则是语法所要求的。
% 上述命令中第一行的最后一个 \ 是续行符。当命令太长而在一行写不下时,可输入一个 \,之后系统将显示一个 >,指示用户继续输入命令。
问题:
find /tmp/ -name *.txt -exec ls -l {} \;
find: 路径必须在表达式之前
Usage: find [-H] [-L] [-P] [path...] [expression]
上面的路径我检查了好几遍,没啥问题。老是出现下面的报警:
find: 路径必须在表达式之前
Usage: find [-H] [-L] [-P] [path...] [expression]
正确格式:
find /tmp/ -name \*.txt -exec ls -l {} \;
find /tmp/ -name "*.txt" -exec ls -l {} \;
通过find查找目录所有后缀名txt的文件,命令为
find /tmp/ -name *.txt -exec ls -l {} \;
会出现“find: 路径必须在表达式之前”的错误提示。解决的方法有两种
使用转义符把*转义,即 \*.txt
用引号引起来 ,即"*.txt"
注意:如果需要把find 的结果提交给while,则既需要转义符,也需要引号
原因:
首先,shell 会扩展*.txt 如果有匹配,根据匹配的数量会有不同的结果。
0 个匹配: *.txt 仍然保持不变
1 个匹配: *.txt 变成那个匹配的文件名
多于 1 个匹配: *.txt 变成多个单词,也就是所有匹配的文件名
例如:/tmp下有1.txt 2.txt就会报错,因为find命令成为了
find /tmp/ -name 1.txt 2.txt -exec ls -l {} \;
只有1.txt会被识别,2.txt无法识别所以会报错。如果要在 -name 中使用正则表达式,必须加以转义,防止 shell 首先扩展它。转义的办法就是加上\或者引号,这样 -name 选项总是只接受这一个参数。
不过在我机器上不转义也不会报错,我觉得各个linux版本之间可能还是会有差异,这个没有对与错,但是需要有一个标准,写命令的时候要按照标准来写,也就是都加上转义,以免写脚本的时候其他机器报错。
今天做一个测试 bash脚本在一个目录下查找所有文件,发现文件不是今天创建的,则把之前的文件全部删除。然后拓展到每到周末星期天都做这么一个动作
写的sh里面测试的时候发现了RT错误
find : 路径必须在表达式之前
我的find 是这样写的
find /data/tmp -mtime +1 rm -f {} \;
也就是在 /data/tmp 里面找文件 然后如果不是今天创建的,那么就全部删除掉,只保留今天的
怎么会提示这个呢: find : 路径必须在表达式之前
find /data/tmp -mtime +1 -exec rm -f {} \;
or
find /data/tmp -mtime +1 | xargs rm -f
http://zqlovejing.blog.51cto.com/766872/307670
今天在linux下给数据库做自动备份,要求每个星期一备份一次,然后备份文件只保留当前一个月的文件。数据备份的shell脚本和守护进程就不说了,我这里只说说查找当前文件夹文件,保留一个月备份上。用到的命令find -exec rm:
一般有2中写法:
#find ... -exec rm {} \;
#find ... | xargs rm -rf
两者都可以把find命令查找到的结果删除,其区别简单的说是前者是把find发现的结果一次性传给exec选项,后者xargs命令会分批次的处理结果。
xargs优点:由于是批处理的,所以执行效率比较高(通过缓冲方式)
xargs缺点:有可能由于参数数量过多(成千上万),导致后面的命令执行失败
若换成 find ....-execrm {} \; 的话,
因为rm 是"逐个" item 去处理的, 则无此忧虑
rm不接受标准输入,所以不能用find / -name "tmpfile" |rm
-exec 必须由一个 ; 结束,而因为通常 shell 都会对 ; 进行处理,所以用 \; 防止这种情况。
{} 可能需要写做 '{}',也是为了避免被 shell 过滤。
例子:
cd /home/useway/DataBackup
find ./ -type f -mtime +30 -exec rm -fr {} \; > /dev/null 2>&1
./表示从当前目录找
-type f,表示只找file,文件类型的,目录和其他字节啥的不要
-mtime +30 表示30天前的文件。
-exec 把find到的文件名作为参数传递给后面的命令行,代替{}的部分
-exec后便跟的命令行,必须用“ \;”结束
/dev/null 2>&1 这样的写法.这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃.
find ./ -mtime +1 -exec ls -l {} \; 可以查看一天前的文件
find ./test -name \*.txt -exec ls {} \;显示文件
find ./test -name \*.txt -exec ls -l {} \;详情
经常使用一条命令,find + -exec参数,但是没有仔细研究过。 今天要写个脚本,又用到这个,故小研究了下了。 如:
find /usr/local/backups -mtime +10 -name "*.*" -exec rm -rf {} /;
删除所有临时文件
find / -name "*.tmp" -exec rm -rf {} /;
查找10天前的dmp文件,并将文件copy到/root/davetmp/目录:
find /root/py -mtime +10 -name "*.dmp" -exec cp {} /root/davetmp/ /;