在Bash中,匹配所有文件/目录名(包括以点开头的文件/目录名)的最短表达式是什么?
我设置了在Bash中,匹配所有文件/目录名(包括以点开头的文件/目录名)的最短表达式是什么?,bash,glob,dotfiles,Bash,Glob,Dotfiles,我设置了extglob和dotlobunset *也会产生和。,与mv或cp一起非常邪恶 我仔细研究了一下,发现*(?()+([^.])和$(ls-a)给出了期望的结果,但我认为应该有一种更简单的方法 编辑:对不起,我应该提到,我正在寻找一个在提示时使用的表达式,而不是在脚本中使用 unset GLOBIGNORE # empty-by-default, but let's make sure shopt -s dotglob # disable special handling for "
extglob
和dotlob
unset
*
也会产生
和。
,与mv
或cp
一起非常邪恶
我仔细研究了一下,发现*(?()+([^.])
和$(ls-a)
给出了期望的结果,但我认为应该有一种更简单的方法
编辑:对不起,我应该提到,我正在寻找一个在提示时使用的表达式,而不是在脚本中使用
unset GLOBIGNORE # empty-by-default, but let's make sure
shopt -s dotglob # disable special handling for "hidden" files
# ...and with the above items both done:
files=( * ) # just an example use of a glob
…将数组文件设置为包含当前目录中除
和之外的所有对象。
;*
的任何其他用法的行为都类似
…将数组文件设置为包含当前目录中除
和之外的所有对象。
;任何其他使用*
的行为都会类似。$(ls-A)
是危险的bug;永远不要用它。(请记住,文件名可以有空格、换行符和通配符);当您要求操作系统列出当前目录中的条目时,它们是它返回的内容,而不是bash编造的神奇别名,因此通常情况下,在没有相反说明的情况下,将操作系统提供的结果返回给您的内容包括进来是合适的。@CharlesDuffy:$(ls-A):是的,谢谢,我没有考虑到这一点。关于
和。
:我知道,我之所以提到这一点,是因为我太天真了,而且做了cp.
,这当然也复制了父目录的内容。我不知道ls-A
被认为是错误的,不管怎样,这是一个好问题,也是一个好答案$(ls-A)
有危险的bug;永远不要用它。(请记住,文件名可以有空格、换行符和通配符);当您要求操作系统列出当前目录中的条目时,它们是它返回的内容,而不是bash编造的神奇别名,因此通常情况下,在没有相反说明的情况下,将操作系统提供的结果返回给您的内容包括进来是合适的。@CharlesDuffy:$(ls-A):是的,谢谢,我没有考虑到这一点。关于
和。
:我知道,我之所以提到这一点,是因为我太天真了,而且做了cp.
,这当然也复制了父目录的内容。我不知道ls-A
被认为是错误的,不管怎样,这是一个好问题,也是一个好答案!别误会,那不是一个表达式,那是一个脚本;)我可以用它来表达:$(unset-GLOBIGNORE;shopt-s-dotglob;echo*)
,但这比我的方法还要长(*(?(+(^.]))
)…当然。我不认为Teess是壳牌公司的一个理想属性——由于过去几十年的向后兼容,以及前人和标准的不好考虑,短的事情通常以一些微妙的方式出错。更好的办法是接受它,处理那些为了正确性而显式使用的代码,或者用另一种语言重写;shopt-s dotglob
可以在脚本顶部发生一次,使glob表达式本身只发生一次*
。($(unset-GLOBIGNORE;shopt-s-dotlob;echo*)
是有缺陷的,原因与ls-A
相同,顺便说一句,另外还有一些其他原因——请参阅re:whyecho
是不可靠的,即使您知道您的shell将是bash)。@Christoph,…请记住,SO的范围仅限于“实际”问题。考虑到正确性的权衡,简洁最重要的是,通常是不切实际的——这就是为什么我们将代码高尔夫游戏禁止而不是允许它们出现在这里的部分原因……无论如何,如果您想在子shell中正确运行它,您可能需要类似这样的东西:readarray-t files<别误会,但这不是一个表达式,这是一个脚本;)我可以用它来表达:$(unset-GLOBIGNORE;shopt-s-dotglob;echo*)
,但这比我的方法还要长(*(?(+(^.]))
)…当然。我不认为Teess是壳牌公司的一个理想属性——由于过去几十年的向后兼容,以及前人和标准的不好考虑,短的事情通常以一些微妙的方式出错。更好的办法是接受它,处理那些为了正确性而显式使用的代码,或者用另一种语言重写;shopt-s dotglob
可以在脚本顶部发生一次,使glob表达式本身只发生一次*
。($(unset-GLOBIGNORE;shopt-s-dotlob;echo*)
是有缺陷的,原因与ls-A
相同,顺便说一句,另外还有一些其他原因——请参阅re:whyecho
是不可靠的,即使您知道您的shell将是bash)。@Christoph,…请记住,SO的范围仅限于“实际”问题。考虑到正确性的权衡,简洁最重要的是,通常是不切实际的——这就是为什么我们将代码高尔夫游戏禁止而不是允许它们出现在这里的原因之一……无论如何,如果您想在子shell中正确运行它,您可能需要类似以下内容:readarray-t文件<