obtendo o diretório de arquivos excluindo o nome da pasta pai

2

Eu quero obter os nomes dos diretórios que contêm arquivos específicos, mas excluo o nome do diretório pai.

Por exemplo:

find ./app -name '*.component.html';

Quando eu uso este comando, ele retorna os resultados mostrados abaixo:

./app/register/register.component.html
./app/_directives/alert.component.html
./app/app.component.html
./app/home/home.component.html
./app/login/login.component.html

Mas quero obter os resultados sem ./app . Isso pode ser feito inserindo o diretório app , desta forma:

cd app; find -name '*.component.html';

./register/register.component.html
./_directives/alert.component.html
./app.component.html
./home/home.component.html
./login/login.component.html

Mas quero fazer isso com um único comando, sem inserir app . Como posso fazer isso?

    
por Mehmet Bektaş 21.12.2016 / 11:57

2 respostas

3

Com o GNU find , você pode usar

find ./app -name '*.component.html' -printf '%P\n'

Da seção -printf de man find :

    %P     File's name with the name  of  the  starting-point  under
           which it was found removed.
    
por steeldriver 21.12.2016 / 12:19
0

A abordagem mais simples é provavelmente usar %P como @steeldriver sugerido. Como alternativa, você pode analisar a saída para remover o nome:

$ find ./app -name '*.component.html' | sed 's#\./app/#./#'
./app.component.html
./home/home.component.html
./_directives/alert.component.html
./login/login.component.html
./register/register.component.html

Ou, você pode executar tudo em um subshell e colocar cd em ./app na subshell para que seu diretório de trabalho permaneça inalterado:

$ pwd 
/home/terdon
$ ( cd app; find -name '*.component.html')
./app.component.html
./home/home.component.html
./_directives/alert.component.html
./login/login.component.html
./register/register.component.html
$ pwd
/home/terdon

Finalmente, você também pode usar o shell em vez de find (), supondo que esteja usando o bash:

$ shopt -s globstar
$ printf '%s\n' ./app/**/*component.html |  sed 's#\./app/#./#'
./app.component.html
./_directives/alert.component.html
./home/home.component.html
./login/login.component.html
./register/register.component.html

Ou

$ shopt -s globstar
$ for f in ./app/**/*component.html ; do echo "${f%./app}"; done
./app/app.component.html
./app/_directives/alert.component.html
./app/home/home.component.html
./app/login/login.component.html
./app/register/register.component.html
    
por terdon 21.12.2016 / 12:44