如何在unix中使用find,不包括大小条件的文件夹和文件?

时间:2016-02-01 11:14:41

标签: unix find solaris

在ksh中使用Solaris 10:

我正在尝试查看所有根磁盘上的大文件,但我需要排除一些文件夹和文件。

目前ksh find命令不成功:

find / -type d \( ! -name NFS* ! -name proc ! -name devices \) -type f \( ! -name /backup_DB0/databases/data/ems_data.dat ! -name /backup_DB1/databases/log/ems_log.dat \) size +1000000 -exec ls -lah {} \; 

这个例子缩短了,文件列表大约有20个文件,命令有限制吗?

2 个答案:

答案 0 :(得分:2)

正如@peterh暗示的那样,你的问题是关于find命令的使用,你选择shell的唯一影响可能是你如何逃避可能的特殊字符,如(和{ {1}}。

您的!命令使用的a grammar您使用不当。不过,你已经关闭了。

就像英语一样,如果你想表达多个条件,你需要一个加入它们的逻辑结构,比如"或"或"和"。 (看看我在那里做了什么?)find命令用隐式"和"连接条件。默认情况下,使用find指定逻辑"或"。例如:

-o find $path condition1 ! \\( condition2 -o condition3

指定condition1必须为true,但如果condition2或condition3为true,则整个表达式为false。

在您的情况下,如果我正确理解您的情况,我建议您更好地构建您的表达:

\\)

有了这个,我已经将你的" ANDed"表达式分成不同的行,以及"或"表达式显示在嵌套括号内。

注意:请记住 -size 的块长(每块512字节)。检查手册页以了解如何指定大小(以字节为单位)。

至于你关于限制的最后一个问题,你当然不应该对20个文件有问题。如果您要处理数千个文件,我们会担心您达到了操作系统设置的限制,find / \( -type d ! \( -name NFS\* -o -name proc -o name devices \) \) \ -o \( -type f ! \( -name ems_data.dat -o -name ems_log.dat \) \) \ -size +1000000 \ -ls ARG_MAX中提到了这一限制。要确定您的特定限制,如果安装了C编译器,则可以运行以下命令:

/usr/include/limits.h

我的系统都告诉我262144个字符是限制。请注意,此限制是由操作系统对POSIX合规性的尝试强加的,因此无论您使用哪个shell, 都应该相同。

答案 1 :(得分:0)

当要排除的文件列表经常更改时,您可能希望使用某种配置文件来排除它们。

# cat /dontfind
/backup_DB0/databases/data/ems_data.dat
/backup_DB1/databases/log/ems_log.dat
# find ... | grep -vf /dontfind | xargs ls -l