Como viajar um diretor de diretórios no Linux

Os diretórios no Linux permitem agrupar arquivos em coleções distintas e separadas. A desvantagem é que se torna tedioso mover de um diretório para outro para realizar uma tarefa repetitiva. Veja como automatizar isso.

índice

  1. tudo sobre diretórios
  2. O comando da árvore
  3. Não analise a saída ls para diretórios de travessia
  4. Usando o comando localizar
  5. Percorrendo árvores de diretórios com um script
  6. a recursão é rara

tudo sobre diretórios

O primeiro comando que você aprende quando introduzido no Linux é provavelmente ls , mas cd não ficará muito atrás. Compreender os diretórios e como movê-los, especialmente subdiretórios aninhados, é uma parte crítica para entender como o Linux é organizado e como você pode organizar seu próprio trabalho em arquivos, diretórios e subdiretórios.

Compreender o conceito de uma árvore de diretórios e como navegar entre eles é um dos muitos pequenos marcos que você passa à medida que se familiariza com o cenário do Linux. Usar cd com um caminho leva você a esse diretório. Atalhos como cd ~ ou cd por si só o levarão de volta ao seu diretório pessoal, e cd .. o levará um nível acima na árvore de diretórios. Simples.

No entanto, não existe uma maneira igualmente simples de executar um comando em todos os diretórios em uma árvore de diretórios. Existem diferentes maneiras de usar essa funcionalidade, mas não há um comando padrão do Linux dedicado a esse propósito.

Alguns comandos, como ls , têm opções de linha de comando que os forçam a operar recursivamente , o que significa que eles começam em um diretório e percorrem metodicamente toda a árvore de diretórios abaixo desse diretório. Para ls é a opção -R (recursiva).

Se precisar usar um comando que não oferece suporte à recursão, você mesmo deverá fornecer a funcionalidade de recursão. É assim que se faz.

O comando da árvore

O comando tree não nos ajudará com a tarefa em mãos, mas facilita a visualização da estrutura de uma árvore de diretórios. Ele desenha a árvore em uma janela de terminal para que possamos obter uma visão geral instantânea dos diretórios e subdiretórios que compõem a árvore de diretórios e suas posições relativas na árvore.

Você terá que instalar a tree .

No Ubuntu você precisa digitar:

 sudo apt install árvore

No Fedora, use:

 sudo dnf install árvore

No Manjaro, o comando é:

 sudo pacman -Sy tree

O uso de tree sem parâmetros desenha a árvore no diretório atual.

 árvore

Você pode passar um caminho para a tree na linha de comando.

 trabalho de árvore

A opção -d (diretórios) exclui arquivos e mostra apenas diretórios.

 árvore -d trabalho

Essa é a maneira mais conveniente de obter uma visão clara da estrutura de uma árvore de diretórios. A árvore de diretórios mostrada aqui é a usada nos exemplos a seguir. Existem cinco arquivos de texto e oito diretórios.

Não analise a saída ls para diretórios de travessia

Seu primeiro pensamento pode ser, se ls pode percorrer recursivamente uma árvore de diretórios, por que não usar ls para fazer exatamente isso e canalizar a saída para outros comandos que analisam os diretórios e executam algumas ações?

A análise da saída de ls é considerada uma prática ruim. Devido à capacidade do Linux de criar nomes de arquivos e diretórios que contêm todos os tipos de caracteres estranhos, torna-se muito difícil criar um analisador genérico universalmente correto.

Você pode nunca criar conscientemente um nome de diretório bobo como este, mas um bug em um script ou aplicativo pode.

A análise de nomes de arquivos e diretórios legítimos, mas ignorados, é propenso a erros. Existem outros métodos que podemos usar que são mais seguros e muito mais robustos do que confiar na interpretação da saída de ls .

Usando o comando localizar

O comando find tem recursos recursivos embutidos e também tem a capacidade de executar comandos para nós. Isso nos permite construir one-liners poderosos. Se for algo que você provavelmente desejará usar no futuro, você pode transformar sua frase de uma linha em um alias ou função shell.

Este comando percorre recursivamente a árvore de diretórios, procurando por diretórios. Cada vez que encontra um diretório, ele imprime o nome do diretório e repete a pesquisa nesse diretório. Depois de concluir a pesquisa em um diretório, ele sai desse diretório e retoma a pesquisa em seu diretório pai.

 find work -type d -execdir echo "In:" {} ;

Você pode ver pela ordem em que os diretórios são listados, como a pesquisa avança na árvore. Ao comparar a saída do comando tree com a saída do find de uma linha, você verá como find pesquisa cada diretório e subdiretório por vez até chegar a um diretório sem subdiretórios. Em seguida, volte um nível e retome a missão nesse nível.

É assim que o comando é composto.

  • find : O domínio find .
  • work : O diretório para iniciar a pesquisa. Isso pode ser um caminho.
  • -type d : Estamos procurando diretórios.
  • -ejecdir : Vamos executar um comando em cada diretório que encontrarmos.
  • echo "In:" {} : este é o comando. Estamos simplesmente ecoando o nome do diretório para a janela do terminal. O "{}" contém o nome do diretório atual.
  • ; : Este é um ponto e vírgula usado para finalizar o comando. Precisamos escapar com a barra invertida para que o Bash não a interprete diretamente.

Com uma pequena alteração, podemos fazer com que o comando find retorne arquivos que correspondam a uma dica de pesquisa. Precisamos incluir a opção -name e uma dica de pesquisa. Neste exemplo, procuramos os arquivos de texto que correspondem a "*.txt" e ecoam seus nomes na janela do terminal.

 find work -name "*.txt" -type f -execdir echo "Found:" {} ;

A pesquisa de arquivos ou diretórios depende do que você deseja alcançar. Para executar um comando em cada diretório, use -type d . Para executar um comando em cada arquivo correspondente, use -type f .

Este comando conta as linhas em todos os arquivos de texto no diretório inicial e nos subdiretórios.

 find work -name "*.txt" -type f -execdir wc -l {} ;

Percorrendo árvores de diretórios com um script

Se você precisar percorrer diretórios em um script, poderá usar o comando find em seu script. Se você precisa, ou apenas quer, fazer as pesquisas recursivas você mesmo, você também pode fazer isso.

 #!/bin/bash shopt -s dotglob nullglob function recursiva { local current_dir dir_or_file for current_dir em $1; faça echo "Comando de diretório para:" $current_dir para dir_or_file em "$current_dir"/*; faça se [[ -d $dir_or_file ]]; então recursivo "$dir_or_file" else wc $dir_or_file fi feito } recursivo "$1"

Copie o texto em um editor e salve-o como "recurse.sh", então use o comando chmod para torná-lo executável.

 chmod +x recurse.sh

O script define duas opções de shell, dotglob e nullglob .

A configuração dotglob significa nomes de arquivos e diretórios que começam com um ponto " . Ele será retornado quando os termos de pesquisa forem expandidos com curingas. Isso significa que estamos incluindo arquivos e diretórios ocultos em nossos resultados de pesquisa.

A configuração nullglob significa que os padrões de pesquisa que não encontram nenhum resultado são tratados como uma string vazia ou nula. Eles não têm como padrão o próprio termo de pesquisa. Em outras palavras, se estivermos procurando por tudo em um diretório usando o curinga asterisco " * , mas não houver resultados, receberemos uma string nula em vez de uma string contendo um asterisco. Isso evita que o script tente abrir um diretório chamado " *" ou trate "*" como um nome de arquivo.

Em seguida, defina uma função chamada recursive . É aqui que as coisas interessantes acontecem.

Duas variáveis ​​são declaradas, chamadas current_dir e dir_or_file . Estas são variáveis ​​locais e só podem ser referenciadas dentro da função.

Uma variável chamada $1 também é usada dentro da função. Este é o primeiro (e único) parâmetro passado para a função quando ela é chamada.

O script usa dois loops for , um aninhado dentro do outro. O primeiro loop for (externo) é usado para duas coisas.

Uma é executar qualquer comando que você deseja executar em cada diretório. Tudo o que estamos fazendo aqui é ecoar o nome do diretório na janela do terminal. Claro, você pode usar qualquer comando ou script, ou chamar outra função de script.

A segunda coisa que o loop for externo faz é verificar todos os objetos do sistema de arquivos que ele pode encontrar, que serão arquivos ou diretórios. Este é o objetivo do interior. for círculo. Por sua vez, cada nome de arquivo ou diretório é passado para a variável dir_or_file .

A variável dir_or_file é então testada em uma instrução if para ver se é um diretório.

  • Nesse caso, a função chama a si mesma e passa o nome do diretório como parâmetro.
  • Se a variável dir_or_file não for um diretório, ela deverá ser um arquivo. Qualquer comando que você deseja aplicar ao arquivo pode ser chamado a partir da cláusula else da instrução if . Você também pode chamar outra função dentro do mesmo script.

A linha final no script chama a função recursive e passa o primeiro parâmetro de linha de comando $1 como o diretório inicial a ser pesquisado. Isso é o que inicia todo o processo.

Vamos executar o script.

 ./recurse.sh funciona

Os diretórios são percorridos e o ponto no script em que um comando seria executado em cada diretório é indicado pelas linhas "Directory command to:". Os arquivos encontrados têm o comando wc run neles para contar linhas, palavras e caracteres.

O primeiro diretório processado é "work", seguido por cada ramificação de diretório aninhado da árvore.

Um ponto interessante a ser observado é que você pode alterar a ordem em que os diretórios são processados, movendo comandos específicos de diretório de cima do loop for interno para abaixo dele.

Vamos mover a linha "Command directory for:" depois do done for circle.

 #!/bin/bash shopt -s dotglob nullglob function recursiva { local current_dir dir_or_file for current_dir em $1; faça para dir_or_file em "$current_dir"/*; faça se [[ -d $dir_or_file ]]; then recursive "$dir_or_file" else wc $dir_or_file fi done echo "Comando de diretório para:" $current_dir done } recursive "$1"

Agora vamos executar o script mais uma vez.

 ./recurse.sh funciona

Desta vez, os diretórios têm os comandos aplicados primeiro dos níveis mais profundos, trabalhando de volta nos ramos da árvore. O diretório passado como parâmetro para o script é processado por último.

Se for importante processar primeiro os diretórios mais profundos, veja como você pode fazer isso.

a recursão é rara

É como ligar para seu próprio telefone e deixar uma mensagem para dizer quando você se verá em seguida, repetidamente.

Pode exigir um pouco de esforço antes que você perceba seus benefícios, mas quando o fizer, descobrirá que é uma maneira programaticamente elegante de lidar com problemas difíceis.

  • Samsung pode cancelar um smartphone favorito dos fãs
  • Adicione carregamento USB-C aos seus AirPods com este kit impresso em 3D

descubra mais conteúdo

O que é um amplificador integrado?

Google Pixel Watch também tem detecção de queda, mas não até o próximo ano

As melhores xícaras de café aquecidas de 2022

Como automatizar seu iPhone com base na hora, atividade ou localização

"Isso deve ter sido antes do meu tempo"

Por que a NASA enviou Snoopy para a Lua? – Revisão Geek

O que é a árvore de diretórios do Windows?

O comando tree nos permite exibir graficamente a estrutura de pastas e arquivos de uma unidade ou caminho específico. Isso nos poupa de ter que procurar uma estrutura completa e poder visualizar em um momento como uma determinada cadeia está organizada.

Como ver a árvore de diretórios?

No Windows 7, é possível configurar o Windows Explorer para que, ao clicar duas vezes em uma pasta, a árvore de diretórios e as dependências dessa pasta sejam exibidas no painel esquerdo.

Como ver a árvore de diretórios no Windows 10?

Olá! É possível, o que você deve fazer é abrir o Windows Explorer e ir para Organizar, Pasta e opções de pesquisa, na guia Geral na seção Painel de navegação, você deve marcar a opção Expandir automaticamente para a pasta atual.

Como visualizar a árvore de diretórios no CMD?

O comando TREE nos permitirá obter uma lista da estrutura de pastas de uma unidade ou caminho específico. A sintaxe deste comando é muito simples, vamos escrever TREE e depois a rota que queremos listar.

Ir arriba