概要:
「奇数」の名前(改行を含む)のファイルで機能します。
set -- *snp* ; echo "$#" # change positional arguments
count=$(printf 'x%.0s' *snp*); echo "${#count}" # most shells
printf -v count 'x%.0s' *snp*; echo "${#count}" # bash
説明
単純なグロブはすべてのファイル名とsnp名前が一致echo *snp*するため、この場合は単純で十分ですが、実際には3つのファイルしか一致しないことを示すために使用します。
$ ls -Q *snp*
"Codigo-0275_tdim.snps.tsv" "foo * bar\tsnp baz.tsv" "S134_tdim.snps.tsv"
残っている唯一の問題は、ファイルを数えることです。はい、grepは通常のソリューションであり、はいで改行を数えることwc -lも通常のソリューションです。grep -c(count)は、snp文字列が一致した回数を実際に数えることに注意してください。1つのファイル名に複数のsnp文字列が含まれている場合、その数は正しくありません。
私たちはもっと上手にできる。
簡単な解決策の1つは、位置引数を設定することです。
$ set -- *snp*
$ echo "$#"
3
位置引数を変更しないようにするには、各引数を1文字に変換し、結果の文字列の長さを出力します(ほとんどのシェルの場合)。
$ printf 'x%.0s' *snp*
xxx
$ count=$(printf 'x%.0s' *snp*); echo "${#count}"
3
または、bashでサブシェルを回避するには:
$ printf -v count 'x%.0s' *snp*; echo "${#count}"
3
ファイルリスト
ファイルのリスト(元の質問から改行を追加したもの):
a='
Codigo-0275_tdim.matches.tsv
Codigo-0275_tdim.snps.tsv
FloragenexTdim_haplotypes_SNp3filter17_single.tsv
FloragenexTdim_haplotypes_SNp3filter17.tsv
FloragenexTdim_SNP3Filter17.fas
S134_tdim.alleles.tsv
S134_tdim.snps.tsv
S134_tdim.tags.tsv'
$ touch $a
touch $'foosnp\nbar.tsv'
中央に改行が1つあるファイルが作成されます。
f o o
s n p \n
b a r
. t s v
そして、glob展開をテストするには:
$ touch $'foo * bar\tsnp baz.tsv'
これにより、アスタリスクが追加されます。引用符で囲まれていない場合は、ファイルのリスト全体に展開されます。