Comando para chegar ao fundo da árvore

1

Existe um comando do Linux que retornará o caminho do arquivo da parte inferior do diretório.

Eu tentei os seguintes comandos: find /home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/ -type d

e

tree -dfi /home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/

Ambos os comandos retornam:

/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/generic
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/admin
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/logandnetworkactivity
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm/a
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/reports

Como você pode ver no caso de:

/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm

    /home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm/a

Ele está retornando /qvm/ , bem como /qvm/a , onde eu quero apenas o diretório inferior.

    
por Colin747 02.09.2012 / 18:00

1 resposta

3

Isso deve fazer o trabalho:

find . -type d | \
  awk -F/ '
    NF <= old_NF {print prev}
    {old_NF=NF; prev=$0}
    END {print $0}
  '

Exemplo:

find . -type d
.
./backup
./source
./source/siteA
./source/siteA/regionA
./source/siteA/regionA/files
./source/siteA/regionB
./source/siteA/regionB/files
./source/siteA/regionD
./source/siteA/regionD/files
./source/siteA/regionC
./source/siteA/regionC/files
./source/dir with space
./source/siteB
./source/siteB/regionA
./source/siteB/regionA/files
./source/siteB/regionB
./source/siteB/regionB/files

Agora, o comando acima fornece:

./backup
./source/siteA/regionA/files
./source/siteA/regionB/files
./source/siteA/regionD/files
./source/siteA/regionC/files
./source/dir with space
./source/siteB/regionA/files
./source/siteB/regionB/files

Uma breve explicação:

A saída find . -type d simples já está classificada de acordo com a estrutura de diretórios. O que você quer agora é aquelas linhas (= caminhos) que estão imediatamente antes de uma linha que tenha a mesma profundidade ou menos. E a última linha (sempre).

Isso é o que o comando awk faz. Divide linhas de entrada no separador de caminho ( -F/ ), armazena o número de campos e a linha ( {old_NF=NF; prev=$0} ) e depois compara o número antigo de campos com o atual e imprime a linha armazenada se o número de campos for menor igual ou igual ( NF <= old_NF {print prev} ). E imprime a última linha sempre ( END {print $0} ).

    
por 02.09.2012 / 18:07

Tags