在写的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结尾的文件)