当前位置: 首页 > 知识库问答 >
问题:

有没有一个匹配文件扩展名的globbing模式,包括PWD模式和递归模式?

蓬弘
2023-03-14

我只需要在所有嵌套目录(包括 PWD)下匹配具有一个特定扩展名的文件,并使用“通配”的 BASH。

  • 我不需要将所有嵌套目录下的所有文件与 shell 通配匹配,但不需要在 PWD 中匹配。
  • 我需要使用 grep 以外的命令匹配文件,搜索所有文件扩展名的目录
  • 我不需要只递归地 grep,而只需要在具有某些扩展名(复数)的文件中
  • 设置 -o globstar; ls **/*.* 适用于所有文件(不是我的问题)。
    • ls **/*.php 在 PWD 中不匹配。
    • set -o globstar;**/*.php返回重复文件。

    从这个答案(这里),我相信可能没有一种方法可以使用球状。

    我需要:

    • glob表达式
    • 要匹配任何可以使用简单globs的命令(lssedcpcatchown等)
    • 主要在BASH中,但其他shell会很有趣
    • 在PWD和所有子目录中递归
    • 对于具有特定扩展名的文件

    我正在使用< code>grep

    • grep-r--包括=GLOB不是cp的全局表达式;它是grep特有的解决方法,不是解决方案。
    • 查找不是一个全局,但如果没有这样的全局表达式,它可能是非grep命令的解决方法。它需要|同时做;等等。

    假设我有这些文件,都包含“找到我”:

    ./file1.js
    ./file2.php
    ./inc/file3.js
    ./inc/file4.php
    ./inc.php/file5.js
    ./inc.php/file6.php
    

    我只需要匹配/所有. php一次:

    ./file2.php
    ./inc/file4.php
    ./inc.php/file6.php
    

    这改变了问题;它不能解决它。

    在进入 shopt -s globstar 作为单个命令之前......

    ls**/*. php返回:

    inc/file4.php
    inc.php/file5.js
    inc.php/file6.php
    
    • file2.php不返回

    在输入shopt-s globstar作为单个命令后。。。

    ls**/*. php返回:

    file2.php
    inc/file4.php
    inc.php/file6.php
    
    inc.php:
    file5.js
    file6.php
    
    • Inc.php/File6.php 返回两次。

    在进入 shopt -s globstar 作为单个命令之前......

    grep -R “Find Me” **/*.php 返回:

    inc/file4.php: find me
    inc.php/file6.php: find me
    
    • file2.php不返回

    在输入shopt-s globstar作为单个命令后。。。

    grep -R “Find Me” **/*.php 返回:

    file2.php: find me
    inc/file4.php: find me
    inc.php/file5.js: find me
    inc.php/file6.php: find me
    inc.php/file6.php: find me
    
    • inc.php/file6.php返回两次。<ul>
    • 在看到从<code>ls</code>输出中看到的重复之后,我们知道了原因
    grep -r "find me" *.php && grep -r "find me" */*.php
    ls -l *.php && ls -l */*.php
    
    • 请不要!我在这里失败了
    grep -r "find me" [GLOB]
    ls -l [GLOB]
    

    grep确实有--包括标志,它实现了相同的结果,但使用了特定于grep的标志。ls没有--包括选项。这让我相信没有这样的全局表达式,这就是grep有这个标志的原因。


共有3个答案

谭向晨
2023-03-14

提出不同的策略:

使用显式查找命令使用-printf选项在选定的文件上构建bash命令。

检查命令的正确性并运行。

 find . -type f -name "*.php" -printf "cp %p ~/destination/ \n"
cp ./file2.php ~/destination/
cp ./inc/file4.php ~/destination/
cp ./inc.php/file5.php ~/destination/
 bash <<< $(find . -type f -name "*.php" -printf "cp %f ~/destination/ \n")
苍嘉澍
2023-03-14

使用 shell 通配,只能通过在 glob 末尾添加 / 来获取目录,但无法专门获取文件(zsh 是一个例外)

对于给定的树:

file.php
inc.php/include.php
lib/lib.php

假设shell支持非标准**glob:

> < li>

**/*。php/扩展为< code>inc.php/

<代码> **/*。php扩展为< code > file . PHP inc.php inc.php/include.php lib/lib . PHP

要获取< code > file . PHP inc.php/include.php库/库. php,不能使用glob。< br> =

递归获取与给定标准 glob 匹配的文件,然后对它们应用命令的 POSIX 方法是使用 find -type f -name ... -exec ...

  • ls -l
find . -type f -name '*.php' -exec ls -l {} +
    < li>grep“找到我”
find . -type f -name '*.php' -exec grep "finde me" {} +
  • 正轨
find . -type f -name '*.php' -type f -exec sh -c 'cp "$@" ~/destination/' _ {} +

<sup>备注:这一点有点棘手,因为您需要<code>~/testination/

秦昂然
2023-03-14
匿名用户

使用bash,您可以首先执行<code>shopt-s globstar</code>以启用递归匹配,然后执行<code<**/*模式。php将扩展到当前目录树中具有.php扩展名的所有文件。

ZSH 和 KSH93 也支持此语法。其他将 glob 模式作为参数并对其进行自己扩展的命令(如您的 grep --include)可能不会。

 类似资料:
  • 我编写了一个脚本,可以递归地从一个目录复制到另一个目录,跳过文件名中具有特定模式的文件: 在大多数情况下,它工作得很好。但我的问题是,它在每个文件夹中创建了一个子文件夹,其中包含文件。例如: 如果输入源作为具有此结构的目录: 我希望在目标文件夹中创建以下结构: 但相反,我得到了: 知道我哪里错了吗?

  • 通配符 # glob_asterisk.py import glob for name in sorted(glob.glob('dir/*')): print(name) # glob_subdir.py import glob print('Named explicitly:') for name in sorted(glob.glob('dir/subdir/*')):

  • 本文向大家介绍OCaml 具有模式匹配的递归列表处理,包括了OCaml 具有模式匹配的递归列表处理的使用技巧和注意事项,需要的朋友参考一下 示例 在这里,我们演示了如何使用OCaml的模式匹配语法来递归处理列表。 在这种情况下,模式[]匹配空列表,而hd::tl匹配任何具有至少一个元素的列表,hd并将列表的第一个元素分配给,列表的其余部分(可以为空)分配给tl。 请注意,这hd::tl是一种非常通

  • 问题内容: 我想在2个不同的基本文件中提供相同的内容。 所以我正在尝试这样做: page1.html: page2.html: 问题是我似乎无法同时使用扩展和包含。有什么办法吗?如果没有,我该如何完成以上工作? commondata.html覆盖base1.html和base2.html中指定的块 这样做的目的是提供pdf和html格式的同一页面,但格式略有不同。上面的问题虽然简化了我要尝试做的事

  • 我在angular 5中实现了一个模式,在.ts文件中使用以下代码进行密码验证。这样做的目的是支持至少八个字符,至少一个大写字母、一个小写字母、一位数字和一个特殊字符。请参阅:密码的Regex必须包含至少八个字符、至少一个数字以及大小写字母和特殊字符 我明白了,当我在密码文本框中输入一个字符串时,例如< code>Niladri1!然而,当我输入一个类似于< code>Nopasss123!!,它

  • 模式,是Rust另一个强大的特性。它可以被用在let和match表达式里面。相信大家应该还记得我们在复合类型中提到的关于在let表达式中解构元组的例子,实际上这就是一个模式。 let tup = (0u8, 1u8); let (x, y) = tup; 而且我们需要知道的是,如果一个模式中出现了和当前作用域中已存在的同名的绑定,那么它会覆盖掉外部的绑定。比如: let x = 1; let c