我有两个目录:
run.2016-02-25_01.
run.2016-02-25_01.47.04
这两个目录都存在于名为gte
的公共目录下。
我想要一个没有点字符.
结束的目录。
我使用以下命令,但是,我无法使其正常工作:
ls run* | grep '.*\d+'
命令无法找到任何内容。
答案 0 :(得分:3)
shell globbing中的否定字符集使用!
而非^
:
ls -d run*[!.]
(^
曾经是|
的古老同义词。)-d
选项列出了目录名,而不是这些目录的内容。
您尝试使用:
ls run* | grep '.*\d+'
需要启用PCRE的grep
和PCRE正则表达式选项(-P
),并且您要查找任意字符后跟一个或多个数字的零个或多个,这不是你说的你想要什么。你可以使用:
ls -d run* | grep '[^.]$'
并不需要PCRE正则表达式,但只是让shell glob正确名称可能是最好的。
如果您担心可能没有名称以run
开头并以点以外的其他内容结尾,您应该考虑shopt -s nullglob
,如Anubhava中所述& #39; s answer。但是,请注意下面hek2mgl和我之间关于特别是ls
命令与shopt -s nullglob
一起可能造成混淆的行为的讨论。如果您使用:
for name in run*[!.]
do
…
done
然后shopt -s nullglob
是完美的;当glob表达式不匹配时,循环迭代零次。当glob表达式是诸如ls
之类的命令的参数,它们在没有命令行参数的情况下提供默认行为时,它并不是那么好。
答案 1 :(得分:1)
您不需要grep
。只需使用:
shopt -s nullglob
ls -d run*[0-9]
如果您的目录并非始终以数字结尾,请使用extglob
:
shopt -s nullglob extglob
ls -d run*+([^.])
或列出{DAME:
结尾的run*
目录内的所有条目
printf "%s\n" run*+([^.])/*
答案 2 :(得分:0)
这有效......
ls|grep '.*[^.]$'
这就是说我想要任何数量的东西,但我希望除了一段时间之外,行结束前的最后一个字符是什么。
答案 3 :(得分:0)
我会使用find
find -regextype posix-awk -maxdepth 1 -type d -regex '-*[[:digit:]]+$'
答案 4 :(得分:0)
列出不以.
结尾的目录。
ls -d run* |grep "[^.]$"