O que é o comando Linux para exibir quantos nomes de arquivos no diretório terminam em dois dígitos?

4

Qual é o comando do Linux para exibir quantos nomes de arquivos no diretório terminam em dois dígitos? Usando ls com um comando como este:

ls -l | wc –l  *[0-9][0-9]
    
por user70573 05.06.2014 / 18:55

4 respostas

2

No Bash, o seguinte funciona de forma não recursiva. Você pode, claro, colocá-lo em uma função:

shopt -q nullglob || restore=1 && shopt -s nullglob
var=(*[0-9][0-9])
echo ${#var[@]}
[ 1 -eq "$restore" ] && shopt -u nullglob

Isso funciona mesmo se você tiver nomes de arquivos malucos. Se os nomes dos seus arquivos não são loucos, então você pode usar essa abordagem ls :

ls -d1b *[0-9][0-9] | wc -l

Observe que os sinalizadores que usei para ls são diferentes: -d fará a lista do diretório, não seu conteúdo (se você tivesse um diretório chamado something00 por exemplo); -1 diz usar uma única coluna para saída; -b escapa nomes de arquivos, o que fará com que a maioria dos nomes de arquivos malucos funcionem.

Ambos incluirão o diretório chamado something00 na contagem. Se você precisa apenas de arquivos ou recursão, find é o que você está procurando. Isso pesquisará o diretório atual ( . ), recursivamente, somente para arquivos ( -type f ):

find . -type f -name '*[0-9][0-9]' -printf 'f\n' | wc -l

Observe o uso de -printf para imprimir apenas a letra f em vez do nome do arquivo. Você só quer contá-los, desta forma, é imune a nomes de arquivos malucos.

    
por 05.06.2014 / 19:35
1

Sem wc -l , se desejar, você pode usar o comando tree , conforme abaixo.

tree -P "*[0-9][0-9]" foldername/

Teste

Dentro de uma das minhas pastas, criei três arquivos que terminam com dois dígitos.

Primeiro, eu emito o ls para ver todos os arquivos.

bash-3.2$ ls
1aga21  abcd  kshexp.ksh  new.txt  temp  temp1  temp12  temp2  temp3  temp34

Agora, vou até uma pasta para usar o comando tree.

Depois disso, emito o comando tree como abaixo.

bash-3.2$ tree -P "*[0-9][0-9]" jun4th/
jun4th/
|-- 1aga21
|-- temp12
'-- temp34

0 directories, 3 files

Como você pode ver, a linha final lista o total de arquivos que correspondem aos nossos critérios. O sinalizador -P do comando tree é para especificar os padrões.

EDITAR

Como o derobert apontou, se houver diretórios que terminem com 2 números e que, por sua vez, contenham vários arquivos que terminem com 2 números, o comando tree produzirá todos os arquivos e resultará em uma saída mais barulhenta. Podemos evitar isso ajustando nosso comando original para algo como abaixo.

tree -P "*[0-9][0-9]" -L 1 jun4th/

Observe o sinalizador -L 1 , que significa procurar arquivos apenas em um subnível abaixo do diretório atual.

    
por 05.06.2014 / 19:37
1

Se você não se importa com o Perl:

perl -E '@a=<*[0-9][0-9]>;say scalar @a'

Note que isto (como todas as outras soluções apresentadas até agora), assume que você quer contar arquivos cujos nomes terminam em dois ou mais dígitos. O arquivo foo123 será contado também.

Se não for o que você deseja, o seguinte Perl imprimirá uma contagem de todos os arquivos (ao contrário dos arquivos e diretórios) cujo nome termina em exatamente dois dígitos:

perl -E 'say scalar grep { -f && /[^0-9][0-9]{2}\z/ } <*>'
    
por 06.06.2014 / 13:52
1

Aqui está uma maneira portátil de fazer a coisa find :

find ././ ! -type d -name '*[0-9][0-9]' | grep -c '^\./\./'

E a função shell:

set -- ./*[0-9][0-9]
for f do
    [ -e "$f" ] && echo
done | wc -l

Para contar de forma recursiva e portável arquivos com ls e corresponder apenas a dois dígitos exatamente no final de um nome de arquivo:

ls ./ -aR1iqp |
grep -c '^ *[0-9].*[^0-9][0-9][0-9]$' 

Para pesquisar apenas no diretório atual, faça isso:

ls ./.* ./* -ad1iqp |
grep -c '^ *[0-9].*[^0-9][0-9][0-9]$'
    
por 05.06.2014 / 20:17