查找不包括结束括号 ')' 的目录

查找不包括结束括号 ')' 的目录

我试图列出所有不以年份结尾的视频目录(而不是文件),例如,(2015)更具体地说,没有列出年份,因此不以右括号结尾)

我怎样才能做与以下相反的事情:

# List all files and directories end with '(2015)'
ls -ld *\(2015\)

# List all files and directories end with ')'
ls -ld *\)

谁能帮助解释如何做到这一点?

答案1

尝试这个:

ls -ld *[^\)]

[] - 我们感兴趣的字符集

^ - 否定(因此我们包含了不需要的字符集)

\) - 转义 ')'

答案2

在 bash 或 zsh 中:

for i in *; do [ -d "$i" ] && [[ ! "$i" =~ \)$ ]] && printf "%s\n" "$i"; done

这将简单地循环当前目录中的所有文件和目录,并检查 i)它们是一个目录(并且 ii)它们的名称不以([ -d "$i" ])结尾。通过这两个测试的项目将被打印。)[[ ! "$i" =~ \)$ ]]

这可以处理任意文件名(哪个ls不能)。

答案3

方法 1a:

ls -ld -- *[^\)]

(使用[…]路径名扩展(通配符/全局)模式: [abc]匹配abc; [^abc]匹配除ab或 之外的任何内容c;因此[^\)]匹配除 之外的任何内容)。)

方法2a:

GLOBIGNORE="*)"
ls -ld -- *

非常不言自明吗?

这两种方法都会匹配文件和其他不是目录的对象。


根据 don_crissti 的建议进行更新,仅查找目录:

方法 1b:

ls -ld -- *[^\)]/

方法2b:

GLOBIGNORE="*)/"
ls -ld -- */

请注意,您必须在值/中包含GLOBIGNORE

答案4

POSIXly:

find . ! -name . -prune -type d ! -name '*)'

zsh

print -rl -- *[^\)](/)

其他类似 Bourne 的 shell 无法过滤通配结果。您可以使用:

printf '%s\n' *[!\)]/

仅匹配目录。但它会在扩展结果中添加一个尾部斜杠。有了目录foo,你就会得到foo/

相关内容