我正在尝试使用.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
答案 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