【问题标题】:find files with glob pattern查找具有 glob 模式的文件
【发布时间】:2013-06-18 07:21:25
【问题描述】:

我需要在文件夹中找到与这样的字符串匹配的文件:

说我有:

/var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz
/var/cache/pacman/pkg/vim-7.3.918-2-x86_64.pkg.tar.xz
/var/cache/pacman/pkg/vim-7.44.918-2-x86_64.pkg.tar.xz

我希望能够运行类似的东西

find /var/cache/pacman/pkg -name 'vim*'

而且它应该只返回有 'vim' 的行,因为 -name 'vim*' ,目前我得到 vim-runtime 太明显了

我需要使用 glob 模式。

这是所有内容的格式:

cachedir               package     packageVersion packageRelease architecture extesnion
/var/cache/pacman/pkg/ vim-runtime 7.3.754        1              x86_64       pkg.tar.xz
/var/cache/pacman/pkg/ vim         7.3.918        2              x86_64       pkg.tar.xz

所以基本上我需要使用'find'命令找到一个确切的包

【问题讨论】:

  • 问:I need to find an exact package using find 答:Specify the exact package to find
  • 你有什么尝试过吗?
  • 以上两个cmets我都不懂
  • 另一种快速的解决方案是将输出通过管道传输到 grep 并从那里使用正则表达式进行过滤 find /var/cache/pacman/pkg -name 'vim*' | grep [regex]
  • @Endoro,显然他已经尝试过了。来吧伙计。

标签: regex bash sed find


【解决方案1】:

如果我理解正确,你想找到 vim-.gz 而不是 vim-runtime.gz。如果那是正确的,请让问题更清楚。答案是:

正则表达式是错误的轨道。发现 -name 选项不使用正则表达式。它使用文件 glob 模式,就像你在命令行上指定的那样。试试

find /var/cache/pacman/pkg -name 'vim-[0-9]*.gz'

edit: vim-[0-9]* 不好,因为它会找到包名称中包含数字的包。但是这个呢?

find /var/cache/pacman/pkg -name 'vim-*-*-*.pkg.tar.xz'

编辑: 对不起,我的错。不起作用,因为 * 匹配 runtime-7.3.754。 也许正则表达式的想法比我想象的要好(不知道 -regex 选项)。 这个怎么样?

find /var/cache/pacman/pkg -regex '.*/vim-[^-]*-[^-]*-[^-]*.pkg.tar.xz'

【讨论】:

  • 是的,我就是这样,到目前为止,我有 'find /var/cache/pacman/pkg -name "packageName-packageVersion-packageRelease-architecture-extension"'
  • find /var/cache/pacman/pkg -name 'vim---*.pkg.tar.xz' 仍然拾取 /var/cache/pacman/pkg /vim-runtime-7.3.754-1-x86_64.pkg.tar.xz
  • 我现在在这里:找到 /var/cache/pacman/pkg/ -name 'vim-[not hyphen]-[0-9]-x86_64.pkg.tar.xz',我只是找不到说“不是连字符”的方法
  • 看我的回答。 [^-] 不是连字符。 [^-] 也可用作 glob 模式,但仅适用于单个字符。在 glob 模式中 * 不会像正则表达式那样将前一项相乘。
  • 谢谢,搞定了。知道如何用 glob 做到这一点吗?但我想我会标记这是解决方案。谢谢
【解决方案2】:

/var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz变成

/var/cache/pacman/pkg/ vim-runtime 7.3.754        1              x86_64       pkg.tar.xz

你可以使用:

files=(
    /var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz 
    /var/cache/pacman/pkg/vim-7.3.918-2-x86_64.pkg.tar.xz
    /var/cache/pacman/pkg/vim-7.44.918-2-x86_64.pkg.tar.xz
)
for f in "${files[@]}"; do
    if [[ $f =~ ^(.*/)(.*)-([^-]+)-([0-9])-([^.]+)\.(.*) ]]; then 
        for i in "${!BASH_REMATCH[@]}"; do 
            echo "$i => ${BASH_REMATCH[$i]}"
        done
    fi      
done

这个输出

0 => /var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz
1 => /var/cache/pacman/pkg/
2 => vim-runtime
3 => 7.3.754
4 => 1
5 => x86_64
6 => pkg.tar.xz
0 => /var/cache/pacman/pkg/vim-7.3.918-2-x86_64.pkg.tar.xz
1 => /var/cache/pacman/pkg/
2 => vim
3 => 7.3.918
4 => 2
5 => x86_64
6 => pkg.tar.xz
0 => /var/cache/pacman/pkg/vim-7.44.918-2-x86_64.pkg.tar.xz
1 => /var/cache/pacman/pkg/
2 => vim
3 => 7.44.918
4 => 2
5 => x86_64
6 => pkg.tar.xz

你可能想要for f in /var/cache/pacman/pkg/*; do

【讨论】:

  • 这很有用,我想我可以用它来解决我的问题。但是最好使用“find /var/cache/pacman/pkg/ -name 'vim-[not hyphen]-[0-9]-x86_64.pkg.tar.xz'”,我只是找不到方法用 glob 说“不是连字符”。谢谢
  • bash 扩展了 glob:shopt -s extglob 然后“非连字符”是 +([^-])。我不认为这会转化为 find 的全局模式
【解决方案3】:

使用模块glob

导入必要的模块

    import pandas as pd
    import glob

写模式:pattern

    pattern = 'uber*'

保存所有文件匹配:csv_files

    uber_files = glob.glob(pattern)

打印文件名

    print(uber_files)

输出:

['uber-raw-data-2014_05.csv', 'uber-raw-data-2014_04.csv', 'uber-raw-data-2014_06.csv']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2019-09-13
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多