如何在unix中使用“查找”,排除具有大小条件的文件夹和文件?

如何在unix中使用“查找”,排除具有大小条件的文件夹和文件?,unix,find,solaris,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 +1000

在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个文件,这个命令有限制吗?

正如@peterh所暗示的,你的问题是关于
find
命令的使用,你选择shell的唯一影响可能是你如何转义潜在的特殊字符,比如

您的
find
命令使用的是您使用得不太正确的内容。不过,您很接近了

与英语一样,如果要表达多个条件,则需要一个逻辑结构来连接它们,如“or”或“and”。
find
命令默认使用隐式“and”连接条件,并使用
-o
指定逻辑“or”。例如:

查找$path
条件1
!\\(
条件2
-o
条件3
\\)

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

在您的情况下,如果我正确理解您的条件,我建议您将表达式构造为:

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
有了这个,我将您的“and”表达式分隔到单独的行中,“or”表达式显示在嵌套的括号中

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

至于你最后一个关于限制的问题,你当然不应该对20个文件有问题。如果你处理数千个文件,我担心你会达到操作系统设置的限制,如
ARG_MAX
from
/usr/include/limits.h
中所述。为了确定你的特定限制,如果你安装了C编译器除此之外,您还可以运行以下操作:

$ cpp <<HERE | tail -1
#include <limits.h>
ARG_MAX
HERE

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

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

@锡安,不客气。如果你觉得这个问题涵盖了你所需要的一切,请随意点击“关闭”这个问题答案旁边的绿色复选标记。