Answers:
只是:
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*'
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
在当前目录中找到所有不包含特定字符串的文件,此处为“ 2013”:
find . ! -name "*2013*" -type f
ls
如果模式与任何文件都不匹配,则会返回错误消息)。另请注意,这ksh
将对列表进行排序。