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?

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.


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.


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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.