Imprime uma lista de caminhos relativos “completos” de todos os arquivos presentes em um diretório e em seus subdiretórios

1

Eu preciso imprimir uma lista de caminhos relativos "completos" de todos os arquivos presentes em um diretório e em seus subdiretórios. Eu costumava fazer isso com du e grep:

du -a <path_to_directory> | grep -Po '[0-9]+\t\/\K.*'

Mas o du substitui parte dos caminhos por pontos se eles forem muito longos.

Qual é uma boa alternativa?

Analisar ls não é uma opção .

    
por kos 24.03.2015 / 23:36

1 resposta

5

A opção mais simples seria find :

$ cd /usr/lib; find .
.
./libxcb-icccm.so.4.0.0
./libbz2.so.1.0.6
./libdca.so.0
./libxcb-composite.so
./libyajl.so
./libswscale.so
./libxvidcore.so.4.3
./libjasper.so.1
./libdrm_intel.so.1
...

Tem vários testes para filtragem, como:

  • -type para filtrar com base no tipo (arquivo regular f , diretório d , etc.)
  • -mindepth e -maxdepth para definir as profundidades às quais find deve pesquisar (não é realmente um teste)
  • -name e -path para filtrar com base no nome do arquivo e no caminho, suportando curingas.
  • e muitos outros testes, para permissões, propriedade, tempos, etc.

Ele oferece uma variedade de formatos de saída, usando a opção -printf .

Dependendo do shell e das opções ativadas, você também pode usar globbing para essa finalidade. Por exemplo, em bash :

$ shopt -s globstar; printf "%s\n" **
accountsservice
accountsservice/accounts-daemon
aisleriot
aisleriot/ar-cards-renderer
aisleriot/guile
aisleriot/guile/2.0
aisleriot/guile/2.0/accordion.go
aisleriot/guile/2.0/agnes.go
aisleriot/guile/2.0/aisleriot
aisleriot/guile/2.0/aisleriot/api.go
...

E em zsh :

$ printf "%s\n" **/*
accountsservice
accountsservice/accounts-daemon
aisleriot
aisleriot/ar-cards-renderer
aisleriot/guile
aisleriot/guile/2.0
aisleriot/guile/2.0/accordion.go
aisleriot/guile/2.0/agnes.go
aisleriot/guile/2.0/aisleriot
aisleriot/guile/2.0/aisleriot/api.go
...
    
por muru 24.03.2015 / 23:47