
Encontrei esse código aquihttps://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.htmlo que me dá o número de arquivos em meu diretório.
ls -1 | wc -l
mas só quero saber quantos nomes desses arquivos começam com 2009 (por exemplo 20091210_005037.nc
).
Eu tentei ls -1 | wc -l 2009*
, mas isso lista lentamente todos os arquivos e não parece me dar um número.
Responder1
set -- 2009*
echo "$#"
Isso define a lista de parâmetros posicionais ( $1
, $2
, ..., etc.) para os nomes correspondentes 2009*
. O comprimento desta lista é $#
.
O problema ls -1 | wc -l 2009*
é que você executa wc -l
diretamente nos arquivos correspondentes 2009*
, contando o número de linhas em cada um. Enquanto isso, ls -1
está tentando gravar na entrada padrão de wc
, que wc
não está lendo, pois recebeu uma lista explícita de arquivos para trabalhar.
Você pode querer usar ls -d 2009* | wc -l
. Isso listaria todos os nomes correspondentes 2009*
(usando ls
with -d
para não listar o conteúdo dos diretórios) e contaria o número de linhas na saída. Observe que isso -1
não é necessário se você canalizar o resultado de ls
algum lugar (a menos que ls
seja um alias ou função shell que force a saída da coluna).
Observe também que isso lhe daria aerradoconte se algum nome de arquivo contém uma nova linha:
$ touch '2009
> was
> a
> good
> year'
$ ls
2009?was?a?good?year
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 May 28 11:09 2009?was?a?good?year
$ ls -1
2009?was?a?good?year
$ ls | wc -l
5
$ ls -1 | wc -l
5
No entanto:
$ set -- 2009*
$ echo "$#"
1
(usar set
e gerar $#
adicionalmente não usa nenhum comando externo na maioria dos shells)
Usando find
para contar recursivamente:
find . -type f -name '2009*' -exec echo . \; | wc -l
Aqui, geramos um ponto para cada nome de caminho encontrado no diretório atual ou abaixo dele e, em seguida, contamos o número de linhas que isso produz. Não contamos as strings do nome do arquivo e, em vez disso, fazemos isso dessa maneira para evitar contar muitas linhas se um nome de arquivo contiver novas linhas.
Com isso find
somos capazes de controlar mais de perto otipodo arquivo que contamos. Acima, testamos explicitamentearquivos normaiscom -type f
(ou seja, não diretórios e outros tipos de arquivos). O *
padrão no shell não faz distinção entre diretórios e arquivos, mas o zsh
shell pode usar *(.)
para modificar o comportamento do padrão para corresponder apenas aos arquivos regulares (o zsh
usuário provavelmente usaria 2009*(.)
em vez de 2009*
nas não find
variações acima e abaixo).
Usando **
in (com shopt -s globstar
in bash
, ou set -o extended-glob
in yash
, ou em qualquer outro shell que possa suportá-lo), para contar recursivamente:
set -- **/2009*
echo "$#"
O padrão **
corresponde quase a *
, mas também corresponde /
a nomes de caminhos.
Responder2
Tentei com o comando abaixo e funcionou bem e obteve o resultado
find . -maxdepth 1 -type f -iname "2009*" | awk '{print NR}'| sed -n '$p'
Nota: Se você quiser também no subdiretório, remova a opção maxprofundidade
Responder3
Obrigado às pessoas nos comentários, esta é a resposta à minha pergunta:
ls 2009* | wc -l
ou usando encontrar
find 2009* | wc -l
Responder4
Para contar o número de arquivos começando com um nome de arquivo específico usando awk.
root@ubuntu$ find . -name "2009*" | awk 'BEGIN{total=0}; {total=total+1} END {print "total files starting with 2009 is " ,total}'
total files starting with 2009 is 4