lista pastas e seu conteúdo

4

Eu precisaria de um relatório de arquivo para cada pasta, o conteúdo e o nome da pasta em si. Se eu fizer

ls -l * 

Eu tenho (isso é apenas um subconjunto de centenas de pastas)

secondary_endosymbiont_of_Heteropsylla_cubana_Thao2000_uid172738:
total 1232
-rw-r--r--  1 FrancescaDeFilippis  staff  627404  2 Nov  2012 NC_018420.ffn

syncytium_symbiont_of_Diaphorina_citri_uid213384:
total 896
-rw-r--r--  1 FrancescaDeFilippis  staff  446934 29 Lug  2013 NC_021885.ffn
-rw-r--r--  1 FrancescaDeFilippis  staff    5594 29 Lug  2013 NC_021886.ffn

uncultured_Sulfuricurvum_RIFRC_1_uid193658:
total 4840
-rw-r--r--  1 FrancescaDeFilippis  staff     1002  9 Apr  2013 NC_020503.ffn
-rw-r--r--  1 FrancescaDeFilippis  staff  2470123  9 Apr  2013 NC_020505.ffn

uncultured_Termite_group_1_bacterium_phylotype_Rs_D17_uid59059:
total 3392
-rw-r--r--  1 FrancescaDeFilippis  staff  851852  1 Mar  2013 NC_020419.ffn
-rw-r--r--  1 FrancescaDeFilippis  staff    6684  1 Mar  2013 NC_020420.ffn
-rw-r--r--  1 FrancescaDeFilippis  staff    3869  1 Mar  2013 NC_020421.ffn
-rw-r--r--  1 FrancescaDeFilippis  staff    2394  1 Mar  2013 NC_020422.ffn
-rw-r--r--  1 FrancescaDeFilippis  staff  848808 28 Ago  2012 NS_000191.ffn
-rw-r--r--  1 FrancescaDeFilippis  staff    6684 28 Ago  2012 NS_000192.ffn
-rw-r--r--  1 FrancescaDeFilippis  staff    3869 28 Ago  2012 NS_000193.ffn
-rw-r--r--  1 FrancescaDeFilippis  staff    2394 28 Ago  2012 NS_000194.ffn

Gostaria de obter algo assim:

secondary_endosymbiont_of_Heteropsylla_cubana_Thao2000_uid172738:  NC_018420.ffn

syncytium_symbiont_of_Diaphorina_citri_uid213384:  NC_021885.ffn
syncytium_symbiont_of_Diaphorina_citri_uid213384:  NC_021886.ffn

e assim por diante, então eu precisaria do nome da pasta repetido para cada arquivo.

Como eu poderia conseguir isso?

    
por Francesca de Filippis 03.02.2015 / 15:18

4 respostas

3

Isso funciona em qualquer shell POSIX:

find <directory> -type f -exec sh -c '
  for f do
    printf "%s: %s\n" "${f%/*}" "${f##*/}"
  done' sh {} +

Este comando é executado em todos os arquivos (nome do arquivo armazenado na variável f ) e exibe o diretório ( ${f%/*} ), dois pontos e o nome do arquivo ( ${f##*/}' ).

    
por 03.02.2015 / 15:36
5
find .

ou

find . -ls

se você quiser detalhes ...

Usando ls com um único nível (diretórios contendo arquivos, não outros diretórios):

ls -1d -- */*

para uma lista simples,

ls -ld -- */*

para detalhes (esse é o dígito 1 no primeiro exemplo, a letra L em minúsculas no segundo).

    
por 03.02.2015 / 15:22
1

com zsh :

for d (*(/N)) {for f ($d/*(N:t)) printf '%s:  %s\n' $d $f; echo}

Agora, se você não se importar em classificar ou excluir arquivos ocultos ou ter uma linha em branco entre os diretórios, (supondo que os nomes de arquivo não contenham caracteres de nova linha), você poderia simplesmente fazer:

find . -path './*/*' -prune -print | sed 's|\./||;s|/|:  |'

Com o GNU find , você também pode fazer:

find . -path './*/*' -prune -printf '%P\n' | sed 's|/|:  |'

Ou:

find . -path './*/*' -prune -printf '%h:  %f\n'

se você não se importa com o líder ./ .

O -path './*/*' -prune é para relatar somente arquivos na profundidade 2 ( ./a/b , mas não ./a ou ./a/b/c ). Com a implementação do find do GNU (e alguns outros), você pode substituí-lo por -mindepth 2 -maxdepth 2 .

    
por 03.02.2015 / 15:32
-1

como sobre. . .

find 'pwd' -type f | perl -lane '@x=split(/\//); print "$x[$#x-1]: $x[$#x]";' 
    
por 03.02.2015 / 21:14