Use o loop para encontrar o número de arquivos em seu diretório atual

1

Eu quero saber se existe uma maneira de usar um loop para verificar os arquivos para o número de arquivos no meu diretório atual sem pipes.

Se eu tiver 3 arquivos, a saída deve ser 3.

Eu sei que você pode fazer facilmente

ls | wc -l 

mas eu quero saber se existe uma maneira de colocar isso em um loop e não usar pipes.

Obrigado

    
por shawn edward 06.03.2016 / 21:47

3 respostas

2

Aqui você vai:

files_num=0
for i in *; do 
  (( files_num++ ))
done
echo $files_num
    
por 06.03.2016 / 21:53
3

No bash, você pode adicionar todos os arquivos a um array e echo o número de elementos no array:

arr=(*)
echo "${#arr[@]}"
    
por 06.03.2016 / 22:15
2

Claro, você pode usar um loop, mas por que você usaria um loop quando não precisa de um?

O shell tem todas as ferramentas para enumerar os arquivos em um diretório e contá-los. A ideia básica (empacotada em uma função) é

count_files () {
  set *
  echo $#
}

i.e. defina os argumentos posicionais para a lista de nomes de arquivos no diretório atual e imprima o número de argumentos posicionais. Isso é dividido em vários casos extremos:

  • Se o primeiro nome de arquivo começar com - , ele será interpretado como uma opção para set . Facilmente resolvido com set -- * .
  • Se não houver arquivos correspondentes, o * não será alterado. Se você quer ser portável para os POSIX shells, você precisa lidar com este caso especial. Se você puder exigir ksh, bash ou zsh, eles terão melhores maneiras.
  • Isso exclui os arquivos de ponto (arquivos iniciados com . ). Eles precisam ser incluídos separadamente. O glob .* lista arquivos de pontos, incluindo . e .. , exceto em pdksh e todos os outros descendentes do shell Forsyth e zsh (e bash if GLOBIGNORE não está vazio). Assumindo que esses não devem ser contados, basta subtrair 2.

solução POSIX:

count_files () {
  set -- * .*
  if [ "$1" = "*" ] && ! [ -e "$1" ] && ! [ -L "$1" ]; then
    shift # Remove the * which didn't match any file
  fi
  echo $#
}

Solução Ksh93:

function count_files {
  typeset FIGNORE='@(.|..)'
  set -- ~(N)
  echo $#
}

Solução de bash:

count_files () (
  shopt -s dotglob nullglob
  set -- *
  echo $#
)

Solução Zsh:

count_files () {
  emulate -LR zsh
  set -- *(DN)
  echo $#
}
    
por 06.03.2016 / 22:18

Tags