Regex ls与正则表达式linux
我有两个目录:Regex ls与正则表达式linux,regex,linux,ls,Regex,Linux,Ls,我有两个目录: run.2016-02-25\u 01. run.2016-02-25_01.47.04 这两个目录都位于名为gte的公共目录下 我想要一个没有点字符结尾的目录 我正在使用以下命令,但无法使其工作: ls run* | grep '.*\d+' 这些命令找不到任何内容。这是有效的 ls|grep '.*[^.]$' 也就是说,我想要任何数量的任何东西,但我希望行结束前的最后一个字符是除句点以外的任何东西。这很有效 ls|grep '.*[^.]$' 也就是说,我想要任何数
run.2016-02-25\u 01.
run.2016-02-25_01.47.04
gte
的公共目录下
我想要一个没有点字符结尾的目录
我正在使用以下命令,但无法使其工作:
ls run* | grep '.*\d+'
这些命令找不到任何内容。这是有效的
ls|grep '.*[^.]$'
也就是说,我想要任何数量的任何东西,但我希望行结束前的最后一个字符是除句点以外的任何东西。这很有效
ls|grep '.*[^.]$'
也就是说,我想要任何数量的东西,但我希望行结束前的最后一个字符是除句点以外的任何东西。您不需要
grep
。只需使用:
shopt -s nullglob
ls -d run*[0-9]
如果您的目录不总是以数字结尾,请使用extglob
:
shopt -s nullglob extglob
ls -d run*+([^.])
或列出run*
目录中以无点结尾的所有条目:
printf "%s\n" run*+([^.])/*
您不需要
grep
。只需使用:
shopt -s nullglob
ls -d run*[0-9]
如果您的目录不总是以数字结尾,请使用extglob
:
shopt -s nullglob extglob
ls -d run*+([^.])
或列出run*
目录中以无点结尾的所有条目:
printf "%s\n" run*+([^.])/*
我会使用
find
find -regextype posix-awk -maxdepth 1 -type d -regex '-*[[:digit:]]+$'
我会使用
find
find -regextype posix-awk -maxdepth 1 -type d -regex '-*[[:digit:]]+$'
列出不以
结尾的目录
ls-d运行*|grep“[^.]$”
列出不以结尾的目录
ls-d run*|grep“[^.]$”
shell globbing中的否定字符集使用代码>非^
:
ls -d run*[!.]
(^
曾经是|
的古老同义词)-d
选项列出目录名,而不是这些目录的内容
您尝试使用:
ls run* | grep '.*\d+'
需要启用PCRE的grep
和PCRE regex选项(-p
),并且您正在查找任何字符的零个或多个后跟一个或多个数字,这不是您所说的所需。您可以使用:
ls -d run* | grep '[^.]$'
这不需要PCRE正则表达式,但简单地让shell glob具有正确的名称可能是最好的
如果你担心名字不可能是“代码”>运行< /代码>,而不是用一个点结束的话,你应该考虑<代码>商店-Null GLUB/<代码>,如S所提到的。但是,请注意下面我和我之间关于潜在混淆行为的讨论,特别是
ls
命令与shopt-s nullglob
的结合。如果您正在使用:
for name in run*[!.]
do
…
done
然后shopt-s nullglob
是完美的;当glob表达式不匹配时,循环迭代零次。如果glob表达式是命令的参数,例如在没有命令行参数的情况下提供默认行为的ls
,那么它就不太好了。shell globbing中的否定字符集使用代码>非^
:
ls -d run*[!.]
(^
曾经是|
的古老同义词)-d
选项列出目录名,而不是这些目录的内容
您尝试使用:
ls run* | grep '.*\d+'
需要启用PCRE的grep
和PCRE regex选项(-p
),并且您正在查找任何字符的零个或多个后跟一个或多个数字,这不是您所说的所需。您可以使用:
ls -d run* | grep '[^.]$'
这不需要PCRE正则表达式,但简单地让shell glob具有正确的名称可能是最好的
如果你担心名字不可能是“代码”>运行< /代码>,而不是用一个点结束的话,你应该考虑<代码>商店-Null GLUB/<代码>,如S所提到的。但是,请注意下面我和我之间关于潜在混淆行为的讨论,特别是
ls
命令与shopt-s nullglob
的结合。如果您正在使用:
for name in run*[!.]
do
…
done
然后shopt-s nullglob
是完美的;当glob表达式不匹配时,循环迭代零次。如果glob表达式是命令的参数,例如在没有命令行参数的情况下提供默认行为的ls
,那么它就不太好了。我不确定您的正则表达式是否会执行您想要的操作,因此您可能希望在以后再次检查它,但是您当前的问题是应该将-d
选项传递给ls
。否则,它将列出目录的内容,而不是目录本身。我不确定您的正则表达式是否能满足您的要求,因此您可能希望在以后再次检查它,但您当前的问题是您应该将-d
选项传递到ls
。否则,它将列出目录的内容,而不是目录本身。OP希望文件夹没有dotYes抱歉,我的解释正好相反。现在修好了。可能应该设置shopt-s nullglob
,因为如果不存在这样的文件夹,当前代码将为您(字面上)提供run*[0-9]/*
Ok,对我有效。确保它是a)一个目录,b)不以点结尾的/*
技巧很好:)OP想要没有dotYes的文件夹抱歉我解释了相反的内容。现在修好了。可能应该设置shopt-s nullglob
,因为如果不存在这样的文件夹,当前代码将为您(字面上)提供run*[0-9]/*
Ok,对我有效。确保它是a)一个目录,b)不以点结尾的/*
技巧很好:)不需要用斜杠转义句号,因为句号在方括号内没有特殊意义。不需要用斜杠转义句号,因为句号在方括号内没有特殊意义。@hek2mgl:真的吗?它适用于我的Bash3.2<代码>>xx1;>xx2;>xx。;ls xx[!.]
仅列出xx1
和xx2
(假设目录中没有其他以xx
开头的3字符文件)。也在Korn shell。谢谢!!正是我所说的