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 / 问题 / 459652
Accepted
Cyker
Cyker
Asked: 2018-08-01 08:30:58 +0800 CST2018-08-01 08:30:58 +0800 CST 2018-08-01 08:30:58 +0800 CST

发现:特别对待斜线

  • 772

我想find用来匹配路径,但我发现了这个:

-path pattern

文件名与外壳模式模式匹配。元字符不处理/' or 。特别; 所以,例如,

  find . -path "./sr*sc"

./src/misc将为名为(如果存在)的目录打印一个条目。

我怎样才能让它只匹配当前目录中的文件?我需要其他工具来完成这项工作吗?

编辑。正如这里所建议的,这里有一些细节。做这项工作有-maxdepth和-regex使用。然而,在实际应用程序中,路径可能是一个变量而不是一个简单的常量,这-maxdepth不会很好地工作并且-regex可能看起来有点矫枉过正。所以我想知道是否有一个简单的解决方案find让它尊重斜线。下面是描述其行为的 rsync 文档,它与我想要的非常接近。

目前最好的解决方案是使用正则表达式,但如果你知道任何可以使它更简单的东西,那将是受欢迎的。


作为我想要的一个例子,这里是 rsync 模式规则:

  • '*' 匹配任何路径组件,但它在斜杠处停止。

  • 使用 '**' 匹配任何内容,包括斜线。

find
  • 3 3 个回答
  • 173 Views

3 个回答

  • Voted
  1. Best Answer
    meuh
    2018-08-01T08:39:11+08:002018-08-01T08:39:11+08:00

    改为使用-regex。该模式锚定在开始和结束处,因此您可能需要.*在开始和结束处使用。用于替换不匹配[^/]*/的 glob 。例如:*/

    -regex '.*/sr[^/]*sc.*'
    

    有一个小的 Perl 脚本find2perl声称将参数转换为find命令到等效的 Perl 脚本。显然,它将具有与-pathas相同的模式匹配find,但您可以对其进行编辑以接受另一个参数,例如-glob,然后它将使用系统调用fnmatch()来执行您想要的那种通配。我对我的版本进行了快速修改,find2perl如下面的补丁所示:

    --- /usr/bin/find2perl  2016-02-04 19:28:48.000000000 +0100
    +++ /tmp/find2perl      2018-07-31 20:38:10.034175198 +0200
    @@ -58,2 +58,4 @@
         $out .= tab . '$File::Find::name =~ /' . fileglob_to_re(shift) . "/s$1";
    +    } elsif (/^glob$/) {
    +        $out .= tab . 'fnmatch("'.(shift).'", $name, FNM_PATHNAME|FNM_PERIOD)';
     } elsif ($_ eq 'perm') {
    @@ -236,2 +238,3 @@
     use File::Find ();
    +use File::FnMatch qw(:fnmatch);    # import everything
    

    (开头的行+显示了我添加的 3 行)。我需要为 Fedora 添加perl-App-find2perl软件包perl-File-FnMatch。您需要在系统上找到等效项。

    然后,您可以运行类似的命令

    /tmp/find2perl . -glob './sr*sc' | perl
    
    • 2
  2. Sergiy Kolodyazhnyy
    2018-08-01T08:36:12+08:002018-08-01T08:36:12+08:00

    为了防止find递归到子目录,使用-maxdepth标志

    find -maxdepth 1 -name "sr*sc"
    
    • 1
  3. Kusalananda
    2018-08-01T09:23:54+08:002018-08-01T09:23:54+08:00

    zsh一些 shell ,例如bash和ksh93支持**文件名通配模式。zsh默认情况下启用它,而必须bash使用和shopt -s globstar启用它。ksh93set -o globstar

    这意味着您应该能够做到,例如,

    for pathname in ./src/**/misc/*.c
        # process "$pathname" here
    done
    

    一些find类似的测试,例如-type f,可以很容易地合并到这里:

    for pathname in ./src/**/misc/*.c
        [ -f "$pathname" ] || continue  # will not skip symbolic links to regular files though
        # process "$pathname" here
    done
    
    • 1

相关问题

  • 如果未引用 -name 后面的模式,则 find 的奇怪行为

  • 将变量从子shell打印到父shell [重复]

  • 检查某个文件夹是否存在于某个目录中

  • 从命令行查找和替换 CSS 文件中的颜色

  • GNU find:在-exec中获取绝对和相对路径

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