如果我做:
find / -name '*image*'
它输出名称中包含“图像”的所有文件和目录:
[...]
/usr/share/mime/image/x-sun-raster.xml
[...]
/usr/include/qt5/QtGui/5.11.1/QtGui/private/qimage_p.h
[...]
所以,从逻辑上讲,如果我这样做:
find / ! -name '*image*'
或者
find / -not -name '*image*'
它应该排除名称中包含“图像”的所有文件和目录。不幸的是,这种情况并非如此; 它仅适用于文件,但不适用于目录:
[...]
/usr/share/doc/qt5/global/template/images/Qt-dark_gradient.png
[...]
我在这里错过了什么?
您
\
在感叹号之前缺少一个转义字符。要查找名称中包含“image”的所有文件和目录,您的命令应如下所示:正如手册页所述,您需要保护 (!) 免受外壳程序的影响:
至于您的第二次尝试,
find / -not -name '*image*'
该-not
标志不符合 POSIX,因此如果您使用的是符合 POSIX 的外壳,它将无法工作。有关该find
命令的信息,请参阅Find Manual Page,并参阅本文了解有关 POSIX 合规性的更多信息。-name '*image*'
测试路径的最后一个组件。(我不相信你是
/usr/share/mime/image/x-sun-raster.xml
从你的第一个命令中得到的。它不匹配。)在这条路上
最后一个组件是
Qt-dark_gradient.png
,因此-name '*image*'
失败,! -name '*image*'
成功。您可能想要
-path
,它与整个路径匹配。排除名称匹配的目录
*image*
是可能的,-prune
但不是那么简单。在某些情况下,这可能是一个好主意,因为它避免了测试(可能很多)无论如何都会被排除的子对象! -path '*image*'
。*image*
如果您在某个目录(或多个目录)下有一棵巨大的树,这将很有用。否则简单! -path '*image*'
就OK;这种次优方法的延迟可以忽略不计。