Eu tenho vários arquivos escritos como */*/*/*/ ... */*.h ou .hpp. Eu preciso obter os diretórios desses arquivos, em vez dos próprios arquivos. Existe alguma maneira, usando sed, eu poderia fazer algo como 'encontrar o último / na linha e excluir o que vier a seguir até \n?\
PS: Eu sei sobre \(.*\) ou (.*) e então me refiro à ith ocorrência como \i, mas existe uma maneira de dizer ao sed para deletar \i?\
Edit:
eu produzi um arquivo de fazer algo como
find . | grep *.h >> file ; find . | grep *.hpp >> file
e o que estou tentando processar é o conteúdo deste arquivo.
Para obter os diretórios que contêm arquivos com sufixos de nome de arquivo
.h
ou.hpp
usandofind
:Isso encontra os nomes de caminho de todos os arquivos regulares cujos nomes correspondem a um dos dois padrões fornecidos. Para cada um desses nomes de caminho, o
dirname
utilitário é usado para extrair a parte do caminho do diretório do nome do caminho.Com GNU
find
, você poderia fazerIsso usa o não padrão
-printf
para imprimir o "cabeçalho" do nome do caminho (ou seja, o caminho do diretório) com a%h
opção de formatação.Para obter nomes de caminho exclusivos, você pode alternar para procurar diretórios em vez de arquivos:
Isso executa um
bash
script curto para lotes de nomes de caminho de diretórios. O script curto é executado com as opçõesnullglob
edotglob
shell habilitadas, o que significa que os padrões de globbing que não correspondem a nada são removidos e esses padrões de globbing também podem corresponder a nomes ocultos.O loop itera sobre o lote atual de nomes de caminho e expande os dois padrões de globbing
*.h
e*.hpp
em cada diretório. Se os padrões corresponderem a pelo menos um nome, o nome do caminho do diretório será gerado.Essa última variação, no entanto, relataria diretórios que contêm arquivos de qualquer tipo que correspondam aos nomes
*.h
ou*.hpp
, não apenas arquivos regulares.Na
zsh
casca:Isso cria uma variável de matriz,
dirs
, que armazenará apenas elementos exclusivos. Nós o inicializamos para o conjunto de diretórios em qualquer lugar abaixo do diretório atual contendo arquivos regulares correspondentes a*.h
ou*.hpp
, e então imprimimos o conteúdo do array.