2013-06-21 26 views
1

我需要找到一个文件夹中的文件是否符合这样的字符串,文件:找到glob模式

说我有:

/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的运行时太明显,因为-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 

所以基本上我需要使用命令找到一个确切的包“发现”

+2

问:'我需要找到一个确切的软件包使用find'答:'指定确切的软件包找到' – devnull

+1

你有_anything_试过吗? – Endoro

+0

我不明白我看到的上述评论 –

回答

1

如果我理解正确,您想找到vim- 。广州但不是vim-runtime .gz。如果这是正确的,请让问题更清楚。答案将是:

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

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' 
+0

是的,这是什么Im到,我有'找到/ var/cache/pacman/pkg -name'packageName-packageVersion-packageRelease-architecture-extension''到目前为止 –

+0

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 –

+0

我现在在这里:find/var/cache/pacman/pkg/-name' vim- [不是连字符] - [0-9] -x86_64.pkg.tar.xz',我只是不能找到一种方式来说'不是连字符' –

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

+0

这很有用,我想我可以用它来解决我的问题。但是使用“find/var/cache/pacman/pkg/-name'vim- [not hyphen] - [0-9] -x86_64.pkg.tar.xz'”会很好,我只是找不到方法用气球说'不要连字号'。谢谢 –

+0

bash扩展了全局:'shopt -s extglob'然后“not-hyphen”是'+([^ - ])'。我不认为这可以转化为找到全局模式 –