요약:
"홀수"이름을 가진 파일 (새 줄 포함)에 적용됩니다.
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*이 경우 충분하지만 정말로 내가 사용하는 것입니다 일치하는 세 개의 파일이 있다는 것을 보여줄 수 :
$ ls -Q *snp*
"Codigo-0275_tdim.snps.tsv" "foo * bar\tsnp baz.tsv" "S134_tdim.snps.tsv"
남아있는 유일한 문제는 파일을 세는 것입니다. 예, grep은 일반적인 해결책이며, 새로운 줄을 세는 wc -l것도 일반적인 해결책입니다. 참고 grep -c(수가) 정말 얼마나 많은 시간을 계산 snp한 파일 이름이 하나 이상있는 경우, 문자열이 일치하고, snp이름에서 문자열을, 카운트가 잘못된 것입니다.
우리는 더 잘할 수 있습니다.
간단한 해결책 중 하나는 위치 인수를 설정하는 것입니다.
$ set -- *snp*
$ echo "$#"
3
위치 인수를 변경하지 않으려면 각 인수를 한 문자로 변환하고 결과 문자열의 길이를 인쇄하십시오 (대부분의 쉘).
$ 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'
중간에 하나의 줄 바꿈이있는 파일이 있습니다.
f o o
s n p \n
b a r
. t s v
그리고 glob 확장을 테스트하려면 :
$ touch $'foo * bar\tsnp baz.tsv'
따옴표가 없으면 별표가 추가되어 전체 파일 목록으로 확장됩니다.