find: mostra diretórios que contêm certos subdiretórios

0

Eu tenho uma lista de diretórios

/u2/tip/coy/inter/fcs/
/u2/tip/coy/inter/fcs/devel
/u2/tip/coy/inter/fcs/ecom_flink
/u2/tip/coy/inter/fcs/totalstable
/u2/tip/coy/inter/fcs/develbi
/u2/tip/coy/inter/fcs/tgn
/u2/tip/coy/inter/fcs/tdhmdcuat
/u2/tip/coy/inter/fcs/ecom_tdhmdc
/u2/tip/coy/inter/fcs/ecom_tdh
/u2/tip/coy/inter/fcs/grow
/u2/tip/coy/inter/fcs/sgsb
/u2/tip/coy/inter/fcs/tdhmdc
/u2/tip/coy/inter/fcs/ecom_grow
/u2/tip/coy/inter/fcs/masupport
/u2/tip/coy/inter/fcs/totalslow
/u2/tip/coy/inter/fcs/ecom_sgsb
/u2/tip/coy/inter/fcs/tdh

Mas apenas um subconjunto deles contém o diretório * / out:

/u2/tip/coy/inter/fcs/devel/out
/u2/tip/coy/inter/fcs/ecom_flink/out
/u2/tip/coy/inter/fcs/ecom_grow/out
/u2/tip/coy/inter/fcs/ecom_sgsb/out
/u2/tip/coy/inter/fcs/ecom_tdhmdc/out
/u2/tip/coy/inter/fcs/ecom_tdh/out
/u2/tip/coy/inter/fcs/tdhmdc/out
/u2/tip/coy/inter/fcs/tdh/out

Gostaria de saber se havia uma maneira de usar um comando (como find ) que, dado o /u2/tip/coy/inter/fcs , retornaria essa lista:

devel
ecom_flink
ecom_grow
ecom_sgsb
ecom_tdhmdc
ecom_tdh
tdhmdc
tdh

Sem a ajuda de grep ou grep - como filtros / ferramentas ( sed , awk e amigos)

    
por Felipe Alvarez 19.06.2014 / 07:31

2 respostas

3

find /u2/tip/coy/inter/fcs -type d -name "out"

retorna o subconjunto de pastas,

/u2/tip/coy/inter/fcs/devel/out
/u2/tip/coy/inter/fcs/ecom_flink/out
/u2/tip/coy/inter/fcs/ecom_grow/out
…etc 

você pode então executar o dirname nesses resultados:

find /u2/tip/coy/inter/fcs -type d -name "out" -exec dirname {} \;

/u2/tip/coy/inter/fcs/devel
/u2/tip/coy/inter/fcs/ecom_flink
/u2/tip/coy/inter/fcs/ecom_grow
…etc

E usando sh -c você pode executar o basename nesse resultado:

find /u2/tip/coy/inter/fcs -type d -name "out" -exec sh -c 'basename "$(dirname "$0")"' {} \;

obrigado slhck pelo acima.

A questão é: está rodando um shell contendo um processo que funciona na saída de um subshell contendo outro processo mais simples, mais rápido ou melhor que piping a saída do find para sed / awk?

    
por 19.06.2014 / 07:45
0
find /u2/tip/coy/inter/fcs -name 'out' -type d |
while read line ; do
    IFS='/'
    set -- $line
    num=$(( $# - 1))
    eval  "echo \"\${$num}\""
done

mas isso falhará miseravelmente quando o nome do arquivo tiver novas linhas incorporadas

    
por 20.06.2014 / 18:13

Tags