find 命令不起作用

find 命令不起作用

如果我做:

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

\感叹号前缺少转义字符。要查找名称中包含“image”的所有文件和目录,您的命令应如下所示:

find / \! -name "*image*"

正如手册页所述,您需要保护 (!) 免受 shell 的影响:

!expr 如果 expr 为假则为真。此字符通常也需要保护以免被 shell 解释。

至于您的第二次尝试find / -not -name '*image*',该-not标志不符合 POSIX 标准,因此如果您使用的是符合 POSIX 标准的 shell,它将不起作用。有关该find命令的信息,请参阅查找手册页,并参考本文有关 POSIX 合规性的更多信息。

答案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*'就行;这种次优方法的延迟可以忽略不计。

相关内容