现在的位置: 首页 > 综合 > 正文

郁闷了半天的SHELL程序:find的写法

2013年10月20日 ⁄ 综合 ⁄ 共 2907字 ⁄ 字号 评论关闭

在写的shell命令中要实现删除某个文件夹下的文件夹,但是当天的内容不能删除.

我用find命令来实现.

首先定义当天的日期字符串: today=$(date + %Y%m%d)

然后find查询并删除: find /usr/test/*  -maxdepth 0 -not -name '${today}*' -exec rm -rf {} /;

我自己直接在命令行里面测试了一下: find /usr/test/*  -maxdepth 0 -not -name '20100424*' -exec rm -rf {}
/;

那个目录下除了以20100424字符串开头的文件夹都被删除了,满足了实际需求.

然后去执行shell文件,验证是否正确.结果发现那个文件下的所有东西都被删除了,包括当天的内容也被删除了.

比较疑惑,或许是自己的linux经验太少,没有及时发现问题.只有求助find --help. 发现文件名的那个地方的单引号需要改为双引号.

修改后的代码: find /usr/test/*  -maxdepth 0 -not -name "${today}*" -exec rm -rf {} /; 测试OK.

 

看来写代码的时候必须更加严格写法.

下面从网上找来一篇find用法的文章内容,直接贴了过来.

(http://shikai-dr.spaces.live.com/blog/cns!8D7056E431BE09C7!160.entry)

Find命令的一般形式
为:find pathname -options [-print -exec -ok]
<<pathname>>



find
命令所查找的目录路径。例如用.表示当前目录,用/表示系统根目录。
<<-print>>


find
命令将匹配的文件输出到标准输出。
<<—exec>>


find
目录对匹配的文件执行该参数所给出的shell命令。相应命令的形式为"'command' {} /;",例如find . -name *.zip
-exec rm {} /;
<<-ok>>



-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
<<-options>>


<-name>


按照文件名查找,最常用的选项,需要用引号将文件名模式引出来。
example:
1、find ~
-name "*.txt" -print (从登陆目录及子目录下查找所有后缀为.txt的文件)
2、find . -name
"*.zip" -print (从当前目录及子目录下查找所有后缀为.zip的文件)
3、find . -name "[a-z]*"
-print(从当前目录及子目录下查找所有小写字母开头的文件)
<-perm>

按照文
件权限查找文件
example:
1、find . -perm 644 -print
(从当前目录及子目录下查找所有权限为644的文件)
2、find . -perm 777 -print = find . -perm
007 -print (从当前目录及子目录下查找所有权限为777的文件)
<-prune>


找文件时忽略某个目录,在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。
example:
1、
find . -name "aaa" -prune -o -print
(在当前目录及子目录下查找所有文件,忽略当前目录及子目录下所有的"aaa"目录)
<-user>


照文件属主查看文件
example:
1、find . -user wayout -print
(在当前目录及子目录下查找所有属主为wayout的文件)
<-nouser>

查找属主
帐户已经被删除的文件
example:
1、find /home -nouser
-print(显示/home/目录下所有的属主用户已经被删除的文件)
<-group>


照文件用户组查看文件
example:
1、find . -group wayout -print
(在当前目录及子目录下查找所有用户组为wayout的文件)
<-nogroup>

查找
用户组已经被删除的文件
example:
1、find /home -nogroup
-print(显示/home/目录下所有的用户组已经被删除的文件)
<-mtime>


照更改时间来查找文件,用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的
文件。
example:
1、
find / -mtime -5 -print(系统根目录下查找更改时间在5日以内的文件)
2、find /var/adm -mtime
+3 -print(在/ v a r / a d m目录下查找更改时间在3日以前的文件)
<-newer>


找更改时间比某个文件新但比另一个文件旧的所有文件。
它的一般形式为:newest_file_name !
oldest_file_name(!是逻辑非符号)
example:
1、find . -newer a.txt -exec ls
-l {} /;(在当前目录及子目录下查找比a.txt要新的文件)
2、find . ! -newer a.txt
-print(在当前目录及子目录下查找不比a.txt新的文件)
3、find . -newer a.txt ! -newer e.req
-print(在当前目录及子目录下查找比a.txt要新,但是不比e.req新的文件)
<-type>


找某种类型的文件
文件七种类型是:
d 目录。
l 符号链接(指向另一个文件)。
s 套接字文件。
b
块设备文件。
c 字符设备文件。
p 命名管道文件。
- 普通文件,或者更准确地说,不属于以上几种类型的文件。
example:
1、
find /etc -type d -print(在/etc目录下查找所有的目录)
2、find . ! -type d
-print(当前目录下查找除目录以外的所有类型的文件)
3、find /etc -type l
-print(在/etc目录下查找所有的符号链接文件)
4、find /etc -type f
-print(在/etc目录下查找所有的普通文件)
<-size>

按照文件长度来查找
文件
这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为Nc;以块计量文件长度只用数字表
示即可。
example:
1、find . -size +1000000c
-print(在当前目录下查找文件长度大于1M字节的文件)
2、find /home/apache -size 100c
-print(在/home/apache目录下查找文件长度恰好为100字节的文件)
3、find . -size -10
-print(在当前目录下查找长度不超过10块的文件[一块等于512字节])
<-depth>


匹配所有的文件,再在子目录中查找
example:
1、find / -name "CON.FILE" -depth
-print(从文件系统的根目录开始,查找一个名为CON.FILE的文件。它将首先匹配所有的文件然后再进入子目录中查找。)
<-mount>


当前的文件系统中查找文件(不进入其他文件系统)
example:
1、find . -name "*.XC" -mount
-print(从当前目录开始查找位于本文件系统中文件名以X C结尾的文件)

抱歉!评论已关闭.