Por que vejo uma diferença na contagem de arquivos entre o Nautilus e o find?

1

Para um projeto universitário, preciso contar todos os arquivos em uma pasta. Eu usei o comando:

find ./dirName | wc -l

Embora quando eu comparo isso com a contagem de arquivos fornecida pelo Nautilus, é consideravelmente mais. Veja a imagem abaixo:

./ dirName é na verdade um diretório de arquivos de um repositório (SVN / GIT) e eu preciso descobrir quantos arquivos compõem o sistema.

Alguém poderia explicar por que essas diferenças ocorrem e talvez me diga qual delas é mais confiável?

    
por danielcooperxyz 22.01.2013 / 23:13

3 respostas

2

O Nautilus não conta arquivos ocultos.

Arquivos e diretórios que começam com um ponto ( . ) estão ocultos no Linux.

Etapas para reproduzir:

mkdir somedir && cd somedir
touch .hidden .hidden2 regular regular2      # 4 files, 2 hidden
find . | wc -l                               # outputs 5 (4 files + dir itself)

Relatórios Nautilus: Conteúdo: 2 itens, totalizando 0 bytes

Usando o Git

Aqui está uma rápida demonstração sobre a quantidade de arquivos para os metadados usados no Git, todos no diretório .git .

git init myrepo                              # Initialized [...] in myrepo/.git/
cd myrepo/
find . | wc -l                               # outputs 23! for an empty repository
tree -a                                      # outputs 10 directories, 12 files

echo "have to add something for git ls-tree" > somefile
git add somefile && git commit -m "Initial commit"
find . | wc -l                               # outputs 38 (!)
git ls-tree -r HEAD | wc -l                  # outputs 1

E também o Nautilus relata 1 lá.

Minha sugestão: use tree

Como Gilles apontou em sua resposta , usando find e canalizando para wc não é excessivamente confiável se os nomes dos arquivos contiverem caracteres especiais.

Parece que tree é capaz de fazer isso corretamente:

tree -a
.
├── dir
│   └── regular3
├── dir2
├── .hidden
├── .hidden2
├── regular
└── regular2

2 directories, 5 files
    
por gertvdijk 22.01.2013 / 23:24
1

Pode haver nomes de arquivos com novas linhas neles. Altamente desaconselhável, mas tecnicamente possível. Isso pode ser o que seu exercício foi sobre.

Uma maneira de contar os arquivos com segurança em um diretório é fazer com que find imprima algo que possa ser contado de maneira confiável, ou seja, com um item por arquivo.

  

encontre ./dirName -printf a | wc -c

Lembre-se de que find inclui dirName em si e recursa em subdiretórios.

Se você quiser apenas os arquivos dentro de dirName , sem recursing, deixe o shell contá-los:

GLOBIGNORE=.:..
set -- *
echo $#
    
por Gilles 22.01.2013 / 23:23
0

Tente verificar a saída de find :

find somewhere | less

Você verá que find , por padrão, gera qualquer tipo de arquivo, sem fazer distinções com base no tipo ou no nome. O Nautilus, em vez disso, não conta o diretório inicial ( somewhere no exemplo) ou arquivos que ele não mostraria ao navegar.

Para resolver o problema, use a opção -type de find:

find somewhere -type f | wc -l
find somewhere ! -type d | wc -l

A primeira linha irá procurar por todos os arquivos regulares. O segundo todos os itens que não são de diretório (por exemplo, arquivos regulares, dispositivos de bloco, soquetes UNIX e assim por diante). Veja man find para mais informações.

Você provavelmente está interessado em ler sobre -H , -L e -P , que controlam como find deve manipular links simbólicos (e, portanto, como os links simbólicos influenciam as contagens).

    
por Andrea Corbellini 22.01.2013 / 23:23