Como posso usar a palavra counter ( wc
) e a canalização para contar quantos arquivos ou diretórios estão no /usr/bin
diretório?
scripting
find
wc
file-types
dinheiro
fonte
fonte
Respostas:
Uma abordagem seria usar
ls
para nos fornecer uma lista dos arquivos, mas queremos que essa lista mostre apenas 1 arquivo ou diretório por linha. A-1
opção fará isso por nós.Exemplo
Crie os dados de amostra acima em um diretório vazio.
Verifique-o:
Agora, para contar, você pode usar
wc -l
para contar o número de linhas, que correspondem a um arquivo ou diretório nals -1
saída.(observe, porém, que ele não inclui os arquivos ocultos)
Contando arquivos ou diretórios, apenas não juntos
Para contar arquivos ou diretórios, você precisa mudar um pouco sua tática. Nesse caso, eu usaria,
ls -l
pois mostra o que é um diretório e o que é um arquivo.Exemplo
Em seguida, podemos usar
grep
para filtrar diretórios ou não diretórios da seguinte forma:Agora basta usar
wc -l
novamente para contar o acima:Porém, você pode evitar
wc
completamente e usargrep
a-c
opção:(novamente, arquivos ocultos não estão incluídos. Observe que diretórios e regulares são dois tipos de arquivos. Existem muitos outros como pipes nomeados, links simbólicos, dispositivos, soquetes ...).
Recursão
Se você precisar encontrar os arquivos e diretórios de forma recursiva
/usr/bin
, provavelmente desejará alterar completamente as táticas e usar outra ferramenta chamadafind
.Exemplo
(embora acima de
/usr/bin
si esteja incluído na contagem)As mesmas técnicas que usei acima podem ser empregadas
ls
para fazer algo semelhante, masls
geralmente não é uma boa ferramenta para analisar a saída.find
por outro lado, foi construído para isso e oferece opções para localizar arquivos ou diretórios.(observe que, desta vez,
find
está incluindo arquivos ocultos (exceto.
e..
)).novas linhas?
Eu nunca descobri por que um caractere de nova linha é um caractere legal a ser usado ao criar nomes de arquivo ou diretório. Portanto, os métodos discutidos acima usam
wc
els
não os contendem, portanto, use-os com isso em mente.Exemplo
Crie um diretório e nome de arquivo com novas linhas.
ls
mostra-os corretamente:Mas
wc
conta os diretórios e arquivos que contêm novas linhas como 2 itens, não um.Um método para contornar isso, se usar a implementação GNU de,
find
é usarfind
a capacidade de imprimir outra coisa no lugar de cada arquivo que encontrar e depois contá-los.Exemplo
Aqui estamos encontrando tudo no diretório atual (exceto
..
) e imprimindo um ponto (.
) para cada um e, em seguida, contando os pontos usandowc
a capacidade de contar bytes em vez de linhaswc -c
,.Referências
fonte
/usr/bin
sejam todos bem formatados (e também não contenham espaços, portanto, tecnicamente, você poderia apenasecho * | wc -w
), é importante notar que tudo isso ocorrerá nos nomes de arquivos que contêm novas linhas.ls -l
ouls -1
quebre b / c, estamos contando linhas, não palavras! Ofind
pode quebrar, mas, novamente, estamos contando linhas, não palavras.touch $'foo\nbar'
dentro de um diretório vazio seguido por um de seus comandos (digamosls -1 | wc -l
), serão relatados dois arquivos em vez de um - porque esse arquivo possui duas linhas no que dizwc
respeito. A menos quels
substitua as novas linhas por algum outro personagem (acho que não, mas novamente não estou em posição de testar agora).wc -c
um problema ao contar os períodos?Se você deseja obter uma divisão do número de cada tipo de arquivo recursivamente sob algum diretório, com o GNU
find
, você pode:No
/usr/bin
meu sistema, isso fornece:Ativado
/dev
:Para links simbólicos, se você preferir contá-los como o tipo de arquivo ao qual eles apontam, em vez disso
symbolic links
, altere-o para:O que agora dá para o meu
/usr/bin
:(um link simbólico quebrado é um link simbólico para um arquivo para o qual
find
não é possível determinar o tipo porque o arquivo não existe ou está em um diretório ao qual você não tem acesso ou há um loop na resolução do caminho do arquivo No meu caso, aqueles 2 onde links simbólicos para arquivos que agora se foram).Nenhum deles conta
.
e..
. Se você os quisesse incluídos (por que você desejaria?), Não há outra maneirafind
de assumir que eles estão lá para todos os diretórios e contá-los sistematicamente:Que então dá no meu
/usr/bin
:Se você não tem acesso ao GNU
find
, pode reescrever o primeiro como:Agora, estritamente falando, não contamos arquivos, mas entradas de diretório . Um diretório como
/usr/bin
normalmente possui várias entradas que apontam para o mesmo arquivo. Por exemplo, aqui, eu tenho:Essas são 3 entradas de diretório (também conhecidas como nomes de arquivos ou links físicos) para o mesmo arquivo (aquele com o inode 672252. Para contar arquivos em vez de entradas de diretório e com GNU
find
e GNUuniq
(ignorando.
e..
arquivos que de qualquer forma são links físicos para outros diretórios):No meu
/usr/bin
, isso dá:fonte
Você não disse se deseja que todo o arquivo seja em / usr / bin recursivamente ou logo abaixo do primeiro nível. Além disso, como você vai conseguir as palavras que está contando? A maneira usual de descobrir é executar a busca no wc. Assim: find / usr / bin | wc -l Find listará tudo o que há lá, diretórios e arquivos. Wc -l contará todas as linhas na saída de localização. Isso é um trabalho de classe? Está tudo bem se estiver, mas eu queria saber por que você precisava dessas informações para que eu pudesse adaptar a resposta com mais cuidado. Entre em contato se precisar de mais. Costa
fonte
No bash, sem ferramentas externas.
No bash, sem ferramentas externas e recursão.
fonte
.
nem..
entradas. Você pode querer desambiguar arquivo x arquivo normal.