script para contar arquivos em um diretório [duplicado]

6

Estou procurando um script que conte arquivos no diretório atual (excluindo sub-diretórios). Deve iterar através de cada arquivo e, se não for um diretório, incrementar uma contagem. A saída deve ser apenas um inteiro representando o número de arquivos.

Eu inventei

find . -type f | wc -l

Mas eu realmente não acho que isso faz toda a contagem. Isso é para uma tarefa, portanto, se você quiser apenas me apontar na direção certa, isso seria ótimo.

    
por user182477 01.08.2016 / 11:03

9 respostas

9

Se você quiser apenas arquivos regulares,

Com o GNU find :

find . -maxdepth 1 -type f -printf . | wc -c

Outro find s:

find . ! -name . -prune -type f -print | grep -c /

(você não quer que -print | wc -l não funcione se houver nomes de arquivo com caracteres de nova linha).

com zsh :

files=(*(ND.)); echo $#files

com ls :

ls -Anq | grep -c '^-'

Para incluir links simbólicos em arquivos normais, altere -type f para -xtype f com GNU find ou -exec test -f {} \; com outros find s ou . com -. com zsh ou adicione a opção -L para ls . Note, entretanto, que você pode obter falsos negativos nos casos em que o tipo do destino do symlink não pode ser determinado (por exemplo, porque ele está em um diretório ao qual você não tem acesso). / p>

Se você quiser qualquer tipo de arquivo (link simbólico, diretório, canais, dispositivos ...), não apenas regular:

find . ! -name . -prune -printf . | wc -c

(altere para -print | grep -c / com não-GNU find , (ND.) para (ND) com zsh , grep -c '^-' com wc -l com ls ).

Isso, entretanto, não conta . ou .. (geralmente, ninguém se importa com eles, pois sempre estão lá), a menos que você substitua -A por -a por ls .

Se você quiser todos os tipos de arquivos, exceto diretórios, Substitua -type f por ! -type d (ou ! -xtype d para também excluir links simbólicos para diretórios) e com zsh , substitua . por ^/ e com ls , substitua grep -c '^-' por grep -vc '^d' .

Se você deseja excluir arquivos ocultos, adicione um ! -name '.*' ou com zsh , remova o D ou com ls , remova o A .

    
por 01.08.2016 / 12:22
3

Para excluir subdiretórios

find . -maxdepth 1 -type f | wc -l

Isso pressupõe que nenhum dos nomes de arquivo contém caracteres de nova linha e que sua implementação de find suporta a opção -maxdepth .

    
por 01.08.2016 / 11:12
3

Para iterar sobre tudo no diretório atual, use

for f in ./*; do

Em seguida, use

[ -f "$f" ]

ou

test -f "$f"

para testar se o que você tem é um arquivo normal (ou um link simbólico para um) ou não.

Observe que isso excluirá arquivos que são soquetes ou especiais de outras maneiras.

Para apenas excluir diretórios , use

[ ! -d "$f" ]

em vez disso.

A citação da variável é importante, pois, do contrário, seria errado se houvesse, por exemplo, um diretório chamado hello world e um arquivo chamado hello .

Para corresponder também aos arquivos ocultos (arquivos com . em seus nomes de arquivos), defina a opção dotglob shell com shopt -s dotglob (em bash ) ou use

for f in ./* ./.*; do

Também pode ser aconselhável definir a opção nullglob shell (em bash ) se você deseja que o shell não retorne nada quando esses padrões glob não corresponderem a nada (caso contrário, você obterá as sequências literais ./* e / ou ./.* em f ).

Observação: evito fornecer um script completo, pois isso é uma atribuição.

    
por 01.08.2016 / 11:18
2
#!/bin/bash

# initialize counter
count=0;

# go through the whole directory listing, including hidden files
for name in * .*
do
    if [[ ! -d $name ]]
    then
        # not a directory so count it
        count=$(($count+1))
    fi
done

echo $count
    
por 01.08.2016 / 11:28
1

Se você quiser algo que manipule arquivos que contenham novas linhas incorporadas e outros caracteres não imprimíveis, essa solução funcionará. Mas é quase certamente um exagero para sua tarefa.

find . -maxdepth 1 -type f -print0 | tr -dc '
find . -maxdepth 1 -type f -print0 | tr -dc '%pre%' | wc -c
' | wc -c

O que isto faz é descartar tudo além do %code% no final de cada nome de arquivo. Em seguida, conta esses caracteres, o que dá o número de arquivos.

    
por 01.08.2016 / 13:50
1

Aqui está um script bash que irá contar e, em seguida, ecoar o número de arquivos (não-diretório) no diretório atual:

#!/usr/bin/env bash
i=0
shopt -s nullglob dotglob
for file in *
do
  [[ ! -d "$file" ]] && i=$((i+1))
done
echo "$i"

A configuração "nullglob" obtém a contagem correta quando não há arquivos (ocultos ou não) no diretório atual; deixar nullglob unset significaria que o loop for (incorretamente) veria um item: * .

A configuração "dotglob" diz ao bash para também incluir arquivos ocultos (aqueles que começam com . ) quando globbing com * . Por padrão, o bash não incluirá . ou .. (consulte: GLOBIGNORE ) quando gerando a lista de arquivos ocultos. Se a sua tarefa não quiser contar os arquivos ocultos, não defina o dotglob.

    
por 02.08.2016 / 05:45
-1

Eu acredito que a forma mais simples de contar os arquivos e diretórios no diretório atual é:

$ ls | wc -w

-w: é usado para contar palavras (não linhas como o -l faz) porque ls produz todos os arquivos e diretórios como uma lista de palavras separadas por espaços vazios.

E para contar apenas os arquivos :
Você pode jogar um pouco com os maravilhosos ls flags que você pode obter os diretórios adicionando uma barra aos diretórios ls -p make ls imprimir os arquivos em linhas com -l e depois inverter grep para filtrar as barras para a frente:

$ ls -pl | grep -v '/' | wc -l
    
por 01.08.2016 / 18:54
-3

Seu comando incluirá subdiretórios.

Eu iria com:

count=0
for file in $(ls -a); do 
  if [ -f $file ]; then 
    count=$(expr $count + 1)
  fi
done
echo "There are $count files on $(pwd)"
    
por 01.08.2016 / 11:10
-3

Eu costumo ficar com o comando **ls** . Isso me dá todos os tipos de possibilidades.

Um exemplo básico:

ls | wc -l 

listará a contagem de todos os arquivos e diretórios em um caminho

ls -R | wc -l 

Listará a contagem de todos os arquivos e diretórios em um caminho e seus subdiretórios.

ls -R *.log | wc -l

A contagem de apenas arquivos de log no caminho e também todos os subdiretórios.

ls -la *.log | wc -l

Fornecerá apenas a contagem dos arquivos de log no diretório atual e não nos subdiretórios.

Você limita aqui é o seu comando ls

'ls' também nos dá a capacidade de filtrar arquivos apenas por uma determinada data, por formatos de arquivo, e muito mais, usando wc em par com 'ls', é possivelmente a melhor solução robusta que eu consideraria.

Dê uma olhada no 'man ls'

    
por 01.08.2016 / 12:49