Se a análise da saída de ls
é perigosa, pois pode quebrar alguns caracteres descolados (espaços \n
, ...), qual é a melhor maneira de saber o número de arquivos em um diretório?
Geralmente confio find
para evitar essa análise, mas, da mesma forma, find mydir | wc -l
será interrompida pelos mesmos motivos.
Estou trabalhando no Solaris agora, mas estou procurando uma resposta o mais portátil possível em diferentes unidades e diferentes tipos de conchas.
find
vai te número de arquivos de forma recursiva (use-maxdepth 1
se você não quer isso.find mydir -maxdepth 1 -type f -printf \\n | wc -l
deve lidar com os caracteres especiais no nome do arquivo, como eles nunca são impressos em primeiro lugar.Respostas:
Que tal esse truque?
Tão portátil quanto
find
ewc
.fonte
n+1
arquivos no meu sistema Debian). Também não filtra arquivos regulares.find
comando para suas necessidades específicas. Sim, este inclui todos os diretórios, incluindo.
(o que pode ser o motivo pelo qual você vê o resultadon+1
).find . -maxdepth 1 ! -name . -exec echo \; | wc -l
; algumas versões mais antigasfind
do não possuem-not
.-maxdepth
não é padrão (uma extensão GNU agora também é suportada por algumas outras implementações).Com bash, sem utilitários externos, nem loops:
Em ksh, substitua
shopt -s dotglob
porFIGNORE=.?(.)
. No zsh, substitua-o porsetopt glob_dots
ou remova ashopt
chamada e usefiles=(*(D))
. (Ou simplesmente largue a linha se não quiser incluir arquivos de ponto.) De maneira portável, se você não se importa com arquivos de ponto:Se você deseja incluir arquivos de ponto:
fonte
1
para um diretório vazio quandonullglob
não está ativado. No zsh,a=(*(DN));echo ${#a}
com o qualificadorN
(nullglob
) não resulta em erro para um diretório vazio.Deve ser bastante portátil para os sistemas pós-anos 80.
Isso conta todas as entradas do diretório, exceto
.
e..
no diretório atual.Para contar arquivos em subdiretórios também:
(esse deve ser portátil mesmo para o Unix V6 (1975), já que não é necessário
-prune
)fonte
find dirname ! -name dirname -prune -print
). Desde então, tenho me perguntado se existe algum motivo específico para usar emgrep -c /
vez dewc -l
(o que provavelmente é mais comumente usado para contar).find dirname ! -name dirname
não funciona se houver outros diretórios nomeadosdirname
. É melhor usarfind dirname/. ! -name .
.wc -l
conta o número de linhas, os nomes de arquivos podem ser feitos de várias linhas, pois o caractere de nova linha é tão válido quanto qualquer outro em um nome de arquivo.Experimentar:
O
-b
terá caracteres não imprimíveis,-A
irá mostrar todos os arquivos, exceto.
e..
e um por linha (o padrão em uma tubulação, mas bom para ser explícito).Contanto que incluamos linguagens de script de nível superior, aqui está uma linha em Python:
Ou com o 'find' completo:
fonte
Yoc pode usar essa construção:
Mas eu tenho medo, você pode errar como
Argument list too long.
no caso de ter muitos arquivos no diretório. No entanto, eu testei no diretório com 10 bilhões de arquivos e funcionou bem.fonte
*
.gnu find . -maxdepth 1 -type f | wc -l
for
.Você já considerou o perl, que deve ser relativamente portátil?
Algo como:
fonte
Tente isto => Usando ls com -i (por número de nó) & F (acrescenta nome do diretório com '/') opções.
fonte
Com uma
perl
linha (reformatada para facilitar a leitura):ou
Você pode usar
perl
funções que modificam matrizes comogrep
oumap
com a segunda versão. Vejaperldoc -f readdir
um exemplo usandogrep
.fonte
A versão mais simples que eu uso o tempo todo e nunca tive problemas é:
ls -b1 | wc -l
fonte
\n
ou outros caracteres descolados (sim, alguns departamentos permitem isso).Além da
find
resposta baseada em proposta por Stéphane , aqui está uma resposta compatível com POSIX com base emls
:fonte