existe um achado 'ascendente'?

7

Eu descobri que eu fiz esta pergunta no site errado do stackexchange.

Para encontrar arquivos a partir de um determinado caminho, posso usar find <path> ... . Se eu quiser encontrar 'upwards', ou seja, no diretório pai, e é pai, e ..., existe uma ferramenta equivalente?

O caso de uso é saber o número correto de pontos (../../x.txt ou ../../../x.txt?) para usar em, e. um makefile incluindo algumas funções comuns do makefile em algum lugar upstream.

Uso pretendido para uma estrutura de pastas como esta:

/
/abc
/abc/dce/efg/ghi
/abc/dce/efg2


$ cd /abc/dce/efg/ghi
$ touch ../../x.txt
$ upfind . -name X*
../../x.txt
$ upfind . -name Y* || echo "not found"
not found
$ touch /abc/dce/efg2/x.txt
$ upfind . -name Y* || echo "not found"
not found
$ 

Então, resumindo:

  • deve pesquisar nesta pasta, é pai, é pai dos pais ...
  • mas não em nenhum de seus irmãos (como "encontrar")
  • ele deve relatar o (s) arquivo (s) encontrado (s) em relação ao caminho atual
por xtofl 31.07.2012 / 11:26

2 respostas

1

Você pode simplesmente dividir o caminho em seus nós constituintes e pesquisar cada um deles discretamente. É um script bash .

IFS=/; dn=($1); ct=${#dn[@]}
for((i=0; i<ct; i++)); do
  subd+=/"${dn[i]}"
  dots=$(for((j=ct-i; j>1; j--)); do printf "../"; done)
  find "$subd" -maxdepth 1 -type f -name "$2" -printf "$dots%f\n"
done

executar upfind $HOME/zt" "Y*" ..., que produz a seguinte saída
quando YABBA existe em / , / home / usuário , / home / user / zt

../../../YABBA
../YABBA
YABBA
    
por 31.07.2012 / 12:14
13

Você pode usar este script simples. Ele percorre a árvore de diretórios e procura os arquivos especificados.

#!/bin/bash
while [[ $PWD != / ]] ; do
    find "$PWD"/ -maxdepth 1 "$@"
    cd ..
done

Uso:

upfind -name 'x*'
    
por 31.07.2012 / 12:22