我试图列出所有不以年份结尾的视频目录(而不是文件),例如,(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]
匹配a
、b
或c
;
[^abc]
匹配除a
、b
或 之外的任何内容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/
。