如果我做:
find / -name '*image*'
它输出名称中包含“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*'
它应该排除名称中包含“image”的所有文件和目录。不幸的是,事实并非如此;它仅适用于文件,而不适用于目录:
[...]
/usr/share/doc/qt5/global/template/images/Qt-dark_gradient.png
[...]
我在这里错过了什么?
答案1
答案2
-name '*image*'
测试路径的最后一个组成部分。
(我不相信你/usr/share/mime/image/x-sun-raster.xml
从第一个命令中得到了什么。它不匹配。)
在这条路上
/usr/share/doc/qt5/global/template/images/Qt-dark_gradient.png
Qt-dark_gradient.png
因此,最后一个组成部分是
-name '*image*'
失败,! -name '*image*'
成功。
您可能想要-path
,它与整个路径匹配。
find / ! -path '*image*'
*image*
可以使用排除名称匹配的目录,-prune
但并不那么简单。在某些情况下,这可能是一个好主意,因为它可以避免测试(可能很多)将被排除的子对象! -path '*image*'
。
find / \( -type d -name '*image*' -prune \) -o \( ! -name '*image*' -print \)
*image*
如果某个目录(或多个目录)下有大量树,这将非常有用。否则,简单! -path '*image*'
就行;这种次优方法的延迟可以忽略不计。