Aqui você vai:
files_num=0
for i in *; do
(( files_num++ ))
done
echo $files_num
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
No bash, você pode adicionar todos os arquivos a um array e echo
o número de elementos no array:
arr=(*)
echo "${#arr[@]}"
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:
-
, ele será interpretado como uma opção para set
. Facilmente resolvido com set -- *
. *
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. .
). 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 $#
}
Tags bash