AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 474499
Accepted
FelixJN
FelixJN
Asked: 2018-10-11 03:43:54 +0800 CST2018-10-11 03:43:54 +0800 CST 2018-10-11 03:43:54 +0800 CST

globstar:`**string*` 不下降到子目录`**​​/*string*` 确实

  • 772

给定的是(子)目录中与字符串匹配的一组文件,例如:

find -name 'string' | sort
./1/2/3/4/string
./1/2/3/string
./1/2/string
./1/string
./string

为什么使用globstar来匹配文件

ls **string
string

无法通过目录运行,而

ls **/string
1/2/3/4/string  1/2/3/string  1/2/string  1/string  string

成功了吗?根据我对man页面描述的理解,它应该匹配(子)目录,不是吗?

像这样的问题通常被标记为"The result of ls * , ls ** and ls ***" 的重复,但那里的答案只有 handle ls **,它确实通过目录递归。似乎双星号后跟一个字符串会中断globstar。

GNU bash v.4.4.19(1)继续运行mint 19


从man bash

全球星

如果设置,路径名扩展上下文中使用的模式 ** 将匹配所有文件以及零个或多个目录和子目录。如果模式后跟 /,则只有目录和子目录匹配。

bash shopt
  • 2 2 个回答
  • 725 Views

2 个回答

  • Voted
  1. Best Answer
    ilkkachu
    2018-10-11T04:26:07+08:002018-10-11T04:26:07+08:00

    这也是它在 Ksh 和 Zsh 中的工作方式。

    $ mkdir -p a/b/cdir
    $ touch    a/b/cfile
    $ ksh -c 'set -o globstar; echo **c*'
    **c*
    $ zsh -c 'echo **c*'
    zsh:1: no matches found: **c*
    

    在模式匹配下,Bash 的手册说:

    当globstar启用 shell 选项并在文件名扩展上下文中使用时,用作单个模式的*两个相邻的 s 将匹配所有文件以及零个或多个目录和子目录。*

    我想这可以理解为“单一模式”是由斜线分隔的部分,因此foo/**/bar它具有单一模式,但**bar没有。

    不过,它可能会更清楚。

    整个模式后面的斜杠使模式只匹配目录:

    $ echo **/c*/
    a/b/cdir/
    
    • 3
  2. user232326
    2018-10-12T02:45:31+08:002018-10-12T02:45:31+08:00

    当不受(仅)限制时,双重*衰减为一的效果:*/

    $ ls *c
    abc  ac  acc  bc  cc  dc
    
    $ ls **c
    abc  ac  acc  bc  cc  dc
    

    任何不是 a/的前导或尾随字符都会导致**衰减:

    这仅仅是因为路径名(作为文件名)不能包含任何/.
    a*无法扩展为包含 的名称/。A**有点相似,它会扩展为/ 仅包含单独或由/(不是任何其他字符/字符串)分隔的字符串:

    $ ls -d ./** | sort
    ./
    ./1
    ./1/2
    ./1/2/3
    ./1/2/3/4
    ./1/2/3/4/string
    ./1/2/3/string
    ./1/2/string
    ./1/string
    ./abc
    ./ac
    ./acc
    ./bc
    ./cc
    ./dc
    ./string
    
    $ ls -d ./**c | sort 
    ./abc
    ./ac
    ./acc
    ./bc
    ./cc
    ./dc
    
    $ ls -d ** | sort
    1
    1/2
    1/2/3
    1/2/3/4
    1/2/3/4/string
    1/2/3/string
    1/2/string
    1/string
    abc
    ac
    acc
    bc
    cc
    dc
    string
    
    $ ls -d **c | sort
    abc
    ac
    acc
    bc
    cc
    dc
    
    $ ls -d **/ | sort
    1/
    1/2/
    1/2/3/
    1/2/3/4/
    
    $ ls -d 1**/ | sort
    1/
    
    • 2

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve