[英]ls and regular expression linux
我有两个目录:
run.2016-02-25_01.
run.2016-02-25_01.47.04
这两个目录都位于名为gte
的通用目录下。
我想要一个没有点号结尾的目录.
。
我正在使用以下命令,但是,我无法使其工作:
ls run* | grep '.*\d+'
命令无法找到任何东西。
shell全局中的否定字符集使用!
不是^
:
ls -d run*[!.]
( ^
曾经是|
的古老同义词。)- -d
选项列出目录名称,而不是这些目录的内容。
您尝试使用:
ls run* | grep '.*\d+'
需要启用PCRE的grep
和PCRE regex选项( -P
),并且您正在寻找零个或多个任何字符,后接一个或多个数字,这不是您想要的。 您可以使用:
ls -d run* | grep '[^.]$'
不需要PCRE正则表达式,但是简单地使用正确的名称作为shell glob可能是最好的。
如果你担心,有可能不是一个名字开始run
,并具有比其他点结束的东西,你应该考虑shopt -s nullglob
,正如上文Anubhava的答案 。 但是,请注意下面在hek2mgl和我自己之间有关ls
命令和shopt -s nullglob
的潜在混乱行为的讨论。 如果您使用的是:
for name in run*[!.]
do
…
done
那么shopt -s nullglob
是完美的; 当glob表达式不匹配时,循环迭代零次。 如果glob表达式是ls
命令的参数,而ls
在没有命令行参数的情况下提供默认行为,那么效果就不好了。
您不需要grep
。 只需使用:
shopt -s nullglob
ls -d run*[0-9]
如果您的目录并非总是以数字结尾,请使用extglob
:
shopt -s nullglob extglob
ls -d run*+([^.])
或列出不带DOT的run*
目录中的所有条目:
printf "%s\n" run*+([^.])/*
这有效...
ls|grep '.*[^.]$'
就是说我想要任何数量的东西,但是我希望行尾之前的最后一个字符是除了句点之外的任何东西。
我会用find
find -regextype posix-awk -maxdepth 1 -type d -regex '-*[[:digit:]]+$'
列出不以结尾的目录.
。
ls -d run* |grep "[^.]$"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.