用glob模式查找文件

时间:2013-06-21 08:13:49

标签: regex bash sed find

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

说我有:

/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'的行,此时我得到vim-runtime太明显因为-name'vim *'

我需要使用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'

找到一个精确的包

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

编辑: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'

答案 2 :(得分:0)

使用模块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']