Localizando subdiretórios em todos os diretórios com o mesmo nome

8

Eu quero executar um comando para:

  1. Encontre todos os diretórios chamados " inc" em uma pasta " X".
  2. Liste todos os subdiretórios em cada " X/.../inc/".
  3. Redirecione a saída para um arquivo chamado " list"

Eu tentei várias combinações do comando abaixo, sem sucesso:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

Como posso fazer isso?

iammilind
fonte

Respostas:

13

find pode fazer isso sozinho:

find X -path '*/inc/*' -type d > list

Leia a -pathparte man findpara mais informações.

Como mencionei rapidamente em um comentário: se você armazenar a linha de diretórios separada em um arquivo de texto, os nomes de diretório que contêm novas linhas não serão inequivocamente representáveis. Se você tem certeza de que os diretórios não contêm novas linhas, tudo bem. Apenas uma observação geral.

Daniel Andersson
fonte
sim. eu dei a mesma resposta aqui
Prince John Wesley
Ou encontre X -name 'inc' -type d> list
MaQleod
@ MaQleod: Não, essa não é a questão.
Daniel Andersson
4

Aqui está uma lista prática:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

É executado findem cada um dos primeiros findresultados. A execopção também pode receber um comando shell mínimo, no qual - como eu disse - {}é substituído por cada diretório do primeiro find.

O segundo find, por sua solicitação, "listará todos os subdiretórios" dos primeiros resultados, incluindo o incdiretório. Se você não quer que se na saída, deixe o segundo find , pelo menos, pastas de saída de profundidade 1.

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

Vamos então redirecionar o comando stdoutpara list.

slhck
fonte
uma variação dessa resposta foi útil para mim, onde eu só queria subdiretórios de profundidade 1 da partida original find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core
1

Tudo bem, eu encontrei a resposta para simular essa descoberta aninhada:

find X/ -type d | grep "/inc/" > list
iammilind
fonte
Bom, isso vai funcionar também! No entanto, nos shells Unix / Linux, não existe realmente a resposta. É uma mistura de preferências pessoais e o que é fácil de seguir.
Vishal Kotcherlakota
Para cuidar de nomes de arquivos não convencionais (mas existentes) com, por exemplo, novas linhas: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -ztambém delimita o caractere nulo, mas sua saída também parece ser nula, portanto, seria necessário canalizá-lo, por exemplo, xargs -0L1 echopara obtê-lo linha por linha ) Nesse caso, como você salva a lista em um arquivo com todas as entradas separadas por nova linha, as novas linhas nos nomes dos arquivos ainda serão representadas de forma ambígua. Talvez você nem precise do arquivo intermediário, dependendo do que deseja fazer com a lista.
Daniel Andersson
1

Tente o seguinte:

   find path-of-x -path '*/inc/*' -type d > list
Prince John Wesley
fonte
eu não tenho máquina linux para testá-lo agora ...
Príncipe John Wesley
Isso não funciona. Mas obrigado por me sugerindo "\inc\":)
iammilind
@iammilind: try with -pathflag
Prince John Wesley