查找不包含指定字符串的文件名


19

我想执行以下相反的操作:

find . -name "*2013*"

查找当前目录中名称中不包含字符串“ 2013”​​的所有文件。我怎样才能做到这一点?

Answers:


28

只是:

find . ! -name '*2013*'

添加a ! -type d还可以排除目录类型的文件(如.本身),或者-type f仅包括常规文件,不包括所有其他类型的文件(目录,fifos,符号链接,设备,套接字...)。

但是要当心*匹配0个或多个字符的序列。因此,它可以报告包含文件名2013,如果是2013在之前或之后的东西,不能完全解码为当前区域设置有效的字符。

如果您所处的语言环境可以将字符编码在一个以上的字节上(如UTF-8),则可能会发生这种情况。例如,在UTF-8语言环境中,Stéphane2013如果文件é已用iso8859-15字符集编码(作为0xe9字节),它将报告一个文件。

最好是确保文件名是在语言环境的字符集中编码的,但是,如果不能保证,可以find在C语言环境中运行:

LC_ALL=C find . ! -name '*2013*'

4

Ksh文件名模式就足够了:

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

参考

如果您的shell是bash,则需要先运行,shopt -s extglob然后才能使用此模式(可以将其放入中.bashrc)。如果您的shell是zsh,则需要运行setopt ksh_glob(可以将其放入.zshrc)。Zsh还提供ls -d -- ^*2013*,这需要初步setopt extended_glob

取决于您对这些文件名的处理方式,ls可能不是正确的命令。将它们存储在数组中

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done

4
这不会在子目录中递归,但是会跳过点文件(ls如果模式与任何文件都不匹配,则会返回错误消息)。另请注意,这ksh将对列表进行排序。
斯特凡Chazelas

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.