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