我想执行相反的操作:
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
不要费心进入名称包含的目录2013
(prune
树的这些部分),因为我们知道我们不希望其中包含任何文件,因为它们的路径将包含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