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

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

我想执行相反的操作:

find . -name "*2013*"

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

答案1

简单地:

find . ! -name '*2013*'

添加 a! -type d也可排除类型的文件目录(就像.它本身一样),或者-type f只包括常规的文件,不包括所有其他类型的文件(目录、fifo、符号链接、设备、套接字...)。

但要注意*匹配 0 个或多个的序列人物。因此,它可以报告文件名,2013其中包含前面或后面是否2013包含当前语言环境中无法完全解码为有效字符的内容。

如果您所在的语言环境允许将字符编码为多个字节(例如 UTF-8),而文件名采用不同的编码,则可能会发生这种情况。例如,至少在 UTF-8 语言环境和 GNU 系统中,如果文件采用 iso8859-15 字符集编码(作为 0xe9 字节),系统会报告该Stéphane2013文件。é

最好是确保文件名以语言环境的字符集进行编码,但如果不能保证这一点,解决方法是find在 C 语言环境中运行:

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

要排除路径中任何位置的文件2013,而不仅仅是其基本名称,您可以这样做:

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

这样做会更有效:

LC_ALL=C find . -name '*2013*' -prune -o -print

也就是说,告诉find不要费心进入名称包含的目录2013prune树的这些部分),因为我们知道我们不希望其中包含任何文件,因为它们的路径将包含2013.


1 假设文件不打算以 GB18030 或 BIG5 等字符集进行编码,这些字符集具有数百个多字节字符,其编码以2.

答案2

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

答案3

find 的一种替代方法!egrep使用选项进行管道传输-v,这会反转匹配的含义,以选择不匹配的行:

find . | egrep -v 2013

这里的优点是使用egrep的所有功能来按照您喜欢的方式过滤输出。

答案4

查找当前目录中不包含特定字符串的所有文件,此处为“2013”​​:

find . ! -name "*2013*" -type f

相关内容