Bash globbing-在一些特定情况下自动展开?

Bash globbing-在一些特定情况下自动展开?,bash,filenames,glob,expansion,Bash,Filenames,Glob,Expansion,我知道通配符*(本身)将以这样一种方式展开,即“当前文件夹中的所有非隐藏文件”,隐藏文件的前缀为句点 我认为有两个用例是有用的,但我不知道如何正确执行: 你怎么能为。。。当前文件夹中的所有文件,包括隐藏文件,但不包括或。 你怎么能为。。。“当前文件夹中的所有隐藏文件(仅隐藏文件),但不包括或。” 建议解决您的第二个需求 .[!.]* 作为指定“点文件”的一种方式,但避免使用和。 当然,ls有-A选项,但这不是全局选项。要展开并回答问题的第二部分,除了和之外的所有文件都可以这样指定。: {.[!

我知道通配符
*
(本身)将以这样一种方式展开,即“当前文件夹中的所有非隐藏文件”,隐藏文件的前缀为句点

我认为有两个用例是有用的,但我不知道如何正确执行:

  • 你怎么能为。。。当前文件夹中的所有文件,包括隐藏文件,但不包括

  • 你怎么能为。。。“当前文件夹中的所有隐藏文件(仅隐藏文件),但不包括

  • 建议解决您的第二个需求

    .[!.]*
    
    作为指定“点文件”的一种方式,但避免使用

    当然,
    ls
    -A
    选项,但这不是全局选项。

    要展开并回答问题的第二部分,除了
    之外的所有文件都可以这样指定。

    {.[!.]*,*}
    
    根据具体的用例,最好设置
    dotglob
    shell选项,以便bash在默认情况下在
    *
    的扩展中包含点文件:

    $ shopt -s dotglob
    $ echo *
    .tst
    

    要满足您的第一个需求,请执行以下操作:

    echo {.,}[^.]*
    

    编辑

    这一个似乎得到了一切,但比短暂的短

    echo {.*,}[^.]*
    
    “所有文件”和“所有隐藏文件”是指仅文件,还是指文件和目录?Globbing对名称进行操作,而不管它是否属于文件或目录。其他人对使用globbing查找隐藏名称和非隐藏名称给出了很好的答案,但您可能希望使用
    find
    命令作为一种更简单的方法来区分这些类型

    要查找“当前文件夹中的所有文件,包括隐藏文件,但不包括.或..”:

    要查找“当前文件夹中的所有文件和目录,包括隐藏文件,但不包括.或..”:

    要查找“当前文件夹中的所有隐藏文件(仅隐藏文件),但不包括.或..”:

    要查找“当前文件夹中的所有隐藏文件和目录(仅隐藏文件和目录),但不包括.或..”:

    请注意,默认情况下,find也将在子目录中递归,因此,如果要将其限制为仅可使用的当前目录,请执行以下操作:

    find . -maxdepth 1 -type f
    

    把某物和答案结合起来

    # dot files but avoiding . and ..
    .[!.]*
    
    # all files but avoiding . and .. 
    {.[!.]*,*}
    

    因此,即使这是旧的-没有使用shopt,这似乎没有得到充分的回答。但是,根据迄今为止给出的答案,这些对我来说很有用:

    1:

    {*,[!.]*,…?*}

    2:


    {....]*,…?*}

    touch..blah;echo{.,}[!.]*| grep blah
    失败。
    触摸..等等;echo{.,}[^.]*| grep blah
    失败。
    {.*,[^.]*,[^.]*}
    无论
    dotglob
    设置如何,都可以工作,避免丢失以两个点开头的文件名,而这里的每个人似乎都忽略了这一点。@ephiement:如果没有以两个点开头的文件名,这会给我一个虚假的匹配。*。
    find . ! -name .
    
    find . -name '.*' -type f
    
    find . -name '.*' ! -name .
    
    find . -maxdepth 1 -type f
    
    # dot files but avoiding . and ..
    .[!.]*
    
    # all files but avoiding . and .. 
    {.[!.]*,*}