c'è una scoperta 'verso l'alto'?


7

Ho trovato ho chiesto questa domanda sul sito sbagliato di stackexchange.

Posso trovare i file a partire da un determinato percorso find <path> .... Se voglio trovare "verso l'alto", cioè nella directory principale, ed è genitore, e ..., c'è uno strumento equivalente?

Il caso d'uso è conoscere il giusto numero di punti (../../x.txt o ../../../x.txt?) Da utilizzare ad es. un makefile che include alcune funzioni di makefile comuni da qualche parte a monte.

Uso previsto per una struttura di cartelle come questa:

/
/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
$ 

Quindi in breve:

  • dovrebbe cercare su questa cartella, è genitore, è genitore di un genitore ...
  • ma non in nessuno dei loro fratelli (come "trovare")
  • dovrebbe riportare i file trovati relativi al percorso corrente

Sembra dal link che hai già scritto uno script che ha risolto il tuo problema ...
Matt

@ Matt: sì, ma cerco sempre di trovare una risposta migliore, e questo è un forum migliore per farlo.
xtofl

Ah. In realtà, penserei che il forum migliore sarebbe COSÌ, no?
Matt

Risposte:


1

Puoi semplicemente dividere il percorso nei suoi nodi di directory costituenti e cercare ognuno in modo discreto. È un bash script.

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

correre upfind $HOME/zt" "Y*" ... che produce il seguente output
quando Yabba esiste in / , / Home / user , / Home / user / zt

../../../YABBA
../YABBA
YABBA

13

Puoi usare questo semplice script. Sposta verso l'alto l'albero delle directory e cerca i file specificati.

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

Uso:

upfind -name 'x*'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.