contar o número de arquivos no diretório com um determinado nome

contar o número de arquivos no diretório com um determinado nome

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 -ldiretamente nos arquivos correspondentes 2009*, contando o número de linhas em cada um. Enquanto isso, ls -1está tentando gravar na entrada padrão de wc, que wcnã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 lswith -dpara não listar o conteúdo dos diretórios) e contaria o número de linhas na saída. Observe que isso -1não é necessário se você canalizar o resultado de lsalgum lugar (a menos que lsseja 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 sete gerar $#adicionalmente não usa nenhum comando externo na maioria dos shells)


Usando findpara 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 findsomos 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 zshshell pode usar *(.)para modificar o comportamento do padrão para corresponder apenas aos arquivos regulares (o zshusuário provavelmente usaria 2009*(.)em vez de 2009*nas não findvariações acima e abaixo).

Usando **in (com shopt -s globstarin bash, ou set -o extended-globin 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

informação relacionada