bash列出某种类型的文件但仅在条件满足时才列出

时间:2016-07-05 13:42:25

标签: bash

我正在尝试使用.vcf列出特定文件扩展名bash。我遇到的问题是目录中可能有多个.vcf,但只需要_只有xxx.vcf,而不是123.vcf 123_count.txt 123_variant_list.vcf 格式(name.vcf)。我不知道该怎么做,但下面似乎很接近。谢谢你:)。

目录文件

select file in $(cd /home/file/overall/stats;ls *.{vcf});do break;done
        echo $file

的bash

123.vcf

所需的输出

html

3 个答案:

答案 0 :(得分:5)

启用extglob并说:

$ echo !(*_*).vcf
123.vcf

即:匹配所有不包含任何_且以.vcf结尾的文件:

$ ls -1
123_count.txt
123.txt
123_variant_list.vcf
123.vcf
$ shopt -s extglob
$ echo !(*_*).vcf
123.vcf

来自Bash Reference Manual → 4.3.2 The Shopt Builtin

  

<强> extglob

     

如果设置,则上述扩展模式匹配功能(参见   Pattern Matching)已启用。

tzot回答的更多信息 How can I use inverse or negative wildcards when pattern matching in a unix/linux shell?

  

!(pattern-list)匹配除给定模式之外的任何内容

答案 1 :(得分:3)

一种方法是使用find和一个简单的正则表达式:

find -regex '[^_]*.vcf'

如果你不想使用正则表达式,你可以按照@ 123的建议,用常规的globbing否定部分匹配:

find ! -name '*_*' -name '*.vcf'

如果您明确要省略子目录:

find -maxdepth 1 ...

如果./在未明确指定路径时前置find,则可以使用basename将其删除:

basename $(find ...)

如果您计划将路径传递给其他某个程序,则前导./应该不是问题。

答案 2 :(得分:1)

您可以列出所有文件和grep那些不包含&#34; _&#34;。

$ file=$(ls | grep "vcf" | grep -v "_")


$ ls | grep vcf
123.vcf
123_count.txt
123_variant_list.vcf

$ echo $file
123.vcf